Python命令行参数

时间:2012-01-27 15:47:25

标签: python command-line command-line-arguments

我刚开始使用python,所以我正在努力解决一个非常简单的例子。基本上我想通过命令行参数传递可执行文件的名称及其输入,例如:

python myprogram refprogram.exe refinput.txt

这意味着在执行myprogram时,它会执行refprogram.exe并将其作为参数refinput传递给它。我尝试按以下方式进行:

import sys, string, os
print sys.argv

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

我得到的错误信息是:

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

任何人都知道我做错了什么?

我正在运行Python 2.7

5 个答案:

答案 0 :(得分:61)

这一行

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

在某些方面有误。

首先,sys.argv是一个列表,因此您可以使用方括号来访问其内容:

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

其次,您过早地在os.system上关闭括号,并且sys.argv(2)在其末尾悬挂。您希望在所有参数之后将右括号移到行的最后。

第三,你需要用逗号分隔参数,一个简单的空格不会。

你的最后一行应如下所示:

res = os.system(sys.argv[1], sys.argv[2])

答案 1 :(得分:29)

使用argparse library这是一个更好的方法。 envoy wrapper库使subprocess更易于使用。

一个简单的例子:

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))

这会读取参数,解析它们,然后将它们作为关键字和值的字典发送到main方法。这使您可以通过传入预构造的字典来独立于参数代码测试main方法。

main方法打印出关键字和值。然后它创建一个命令字符串,并将其传递给envoy运行。最后,它打印命令的输出。

如果您安装了pip,可以使用pip install envoy安装envoy。获得点子的最简单方法是使用pip-installer

答案 2 :(得分:8)

sys.argv是一个列表,并使用方括号进行索引,例如sys.argv[1]。您也可以在对其进行索引之前检查len(sys.argv)

此外,如果您想将参数传递给os.system(),您可能需要类似os.system(' '.join(sys.argv[1:]))的内容,但这对于带空格的参数不起作用。你最好使用子进程模块。

答案 3 :(得分:3)

sys.argv是一个列表

import sys, string, os
print sys.argv

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

答案 4 :(得分:1)

如果您运行的是Python 2.7,建议使用新的subprocess模块。

在这种情况下,你会写

import sys, subprocess
result = subprocess.check_output(sys.argv[1], sys.argv[2])