Python command line parameters

2019-02-01 07:03发布

I am just starting with python so I am struggling with a quite simple example. Basically I want pass the name of an executable plus its input via the command line arguments, e.g.:

python myprogram refprogram.exe refinput.txt

That means when executing myprogram, it executes refprogram.exe and passes to it as argument refinput. I tried to do it the following way:

import sys, string, os
print sys.argv

res = os.system(sys.argv(1)) sys.argv(2)
print res

The error message that I get is:

res = os.system(sys.argv(1)) sys.argv(2)
                           ^
SyntaxError: invalid syntax

Anyone an idea what I am doing wrong?

I am running Python 2.7

5条回答
劳资没心,怎么记你
2楼-- · 2019-02-01 07:41

sys.argv is a list, and is indexed using square brackets, e.g. sys.argv[1]. You may want to check len(sys.argv) before indexing it as well.

Also, if you wanted to pass parameters to os.system(), you might want something like os.system(' '.join(sys.argv[1:])), but this won't work for arguments with spaces. You're better off using the subprocess module.

查看更多
小情绪 Triste *
3楼-- · 2019-02-01 07:41

If you are running Python 2.7 it is recommended to use the new subprocess module.

In this case you would write

import sys, subprocess
result = subprocess.check_output(sys.argv[1], sys.argv[2])
查看更多
欢心
4楼-- · 2019-02-01 07:52

This line

res = os.system(sys.argv(1)) sys.argv(2)

Is wrong in a couple of ways.

First, sys.argv is a list, so you use square brackets to access its contents:

sys.argv[1]
sys.argv[2]

Second, you close out your parentheses on os.system too soon, and sys.argv(2) is left hanging off of the end of it. You want to move the closing parenthesis out to the very end of the line, after all of the arguments.

Third, you need to separate the arguments with commas, a simple space won't do.

Your final line should look like this:

res = os.system(sys.argv[1], sys.argv[2])
查看更多
可以哭但决不认输i
5楼-- · 2019-02-01 07:57

sys.argv is a list

import sys, string, os
print sys.argv

res = os.system(sys.argv[1]) sys.argv[2]
print res
查看更多
贼婆χ
6楼-- · 2019-02-01 07:59

A far, far better way to do this is with the argparse library. The envoy wrapper library makes subprocess easier to work with as well.

A simple example:

import argparse
import envoy

def main(**kwargs):
    for key, value in kwargs.iteritems():
        print key, value
    cmd = '{0} {1}'.format(kwargs['program'], ' '.join(kwargs['infiles']))
    r = envoy.run(cmd)
    print r.std_out
    print r.std_err

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Get a program and run it with input', version='%(prog)s 1.0')
    parser.add_argument('program', type=str, help='Program name')
    parser.add_argument('infiles', nargs='+', type=str, help='Input text files')
    parser.add_argument('--out', type=str, default='temp.txt', help='name of output file')
    args = parser.parse_args()
    main(**vars(args))

This reads in the arguments, parses them, then sends them to the main method as a dictionary of keywords and values. That lets you test your main method independently from your argument code, by passing in a preconstructed dictionary.

The main method prints out the keywords and values. Then it creates a command string, and passes that to envoy to run. Finally, it prints the output from the command.

If you have pip installed, envoy can be installed with pip install envoy. The easiest way to get pip is with the pip-installer.

查看更多
登录 后发表回答