Python命令行参数

25

我刚开始学习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。


3
我希望我的电脑能够显示错误信息。 :-) - LarsH
5个回答

62

这一行

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

29
argparse库是实现这个功能的一个更好的方法,envoy包装库也使得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))

这段代码读取参数,解析它们,然后将它们作为关键字和值的字典发送给主方法。这样,您可以通过传递一个预构建的字典来独立测试您的主方法与您的参数代码。

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

如果您已安装 pip,则可以使用 pip install envoy 命令安装 envoy。获取 pip 的最简单方法是使用 pip-installer


2
总体上同意(argparse非常好用),但对于初学者的实用脚本来说,可能有些过头了。 - user395760
3
我认为解决了很多问题,所以最好还是硬着头皮学习它。我还添加了一些关于使用 envoy 而不是 os.command 的内容,因为在原始问题中我错过了这一点。 - Spencer Rathbun
4
永远不会过度。实用脚本有一种变成永久生产功能的方式。 - S.Lott
1
http://docs.python.org/dev/howto/argparse.html 是一个对于不熟悉 argparse 的人来说更为友好的介绍。 - El Yobo
1
这永远不会过度设计?天哪...有时候,YAGNI。 - LarsH

8

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

此外,如果您想将参数传递给os.system(),您可能需要像这样使用os.system(' '.join(sys.argv[1:])),但对于带有空格的参数,这种方法可能不起作用。最好使用subprocess模块。


3

sys.argv是一个列表

import sys, string, os
print sys.argv

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

1

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

在这种情况下,您将编写

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接