2012-01-27 115 views
26

我刚刚开始使用python,所以我正在用一个很简单的例子挣扎。基本上我想传递一个可执行文件的名称加上通过命令行参数的输入,例如: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 2013-12-17 16:03:50

回答

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

sys.argv是一个列表,并使用方括号,例如址变sys.argv[1]。编制索引之前,您可能还需要检查len(sys.argv)。另外,如果您想将参数传递给os.system(),您可能需要类似os.system(' '.join(sys.argv[1:]))的东西,但这对带空格的参数不起作用。你最好使用子进程模块。

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

一个远远更好的方式来做到这一点是与argparse libraryenvoy 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)) 

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

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

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

+2

同意一般(argparse是真棒),但对于初学者的无限脚本,它可能是矫枉过正。 – delnan 2012-01-27 15:58:09

+3

@delnan它解决了很多问题,我认为最好是咬住子弹并学习它。我还在使用'envoy'而不是'os.command'上添加了一些内容,因为我在原始问题中错过了这个。 – 2012-01-27 16:10:35

+4

它从来没有矫枉过正。实用程序脚本有一种成为永久性生产功能的方法。 – 2012-01-27 16:39:54