Python命令行参数

Python命令行参数,python,command-line,command-line-arguments,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.arg

我刚开始学习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
有人知道我做错了什么吗


我正在运行Python2.7

sys.argv
是一个列表,并使用方括号编制索引,例如
sys.argv[1]
。在为len(sys.argv)编制索引之前,您可能需要检查它

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

sys.argv是一个列表

import sys, string, os
print sys.argv

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

如果您正在运行Python2.7,建议使用新模块

在这种情况下,你会写

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

要做到这一点,更好的方法是使用。该库也使工作更容易

一个简单的例子:

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方法打印出关键字和值。然后它创建一个命令字符串,并将其传递给特使运行。最后,它打印命令的输出

如果您安装了pip,则可以使用
pip安装特使
安装特使。获取pip的最简单方法是使用。

这一行

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

大体上同意(argparse非常棒),但对于初学者来说,这可能有点过头了。@delnan它解决了很多问题,所以我认为咬紧牙关学习它会更好。我还添加了一点关于使用
embasic
而不是
os.command
的内容,因为我在最初的问题中忽略了这一点。这从来都不过分。实用程序脚本有一种成为永久性生产功能的方式。对于那些不熟悉argparse的人来说,argparse是一个“更温和”的介绍吗?它永远不会过分?好悲伤。。。有时候,雅格尼。我希望我的电脑能给我一个错误信息。:-)