Python命令行参数

Pat*_*ick 25 python command-line command-line-arguments

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

python myprogram refprogram.exe refinput.txt
Run Code Online (Sandbox Code Playgroud)

这意味着在执行时myprogram,它会执行refprogram.exe并作为参数传递给它refinput.我试着通过以下方式做到:

import sys, string, os
print sys.argv

res = os.system(sys.argv(1)) sys.argv(2)
print res
Run Code Online (Sandbox Code Playgroud)

我得到的错误消息是:

res = os.system(sys.argv(1)) sys.argv(2)
                           ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

谁知道我做错了什么?

我正在运行Python 2.7

Ian*_*and 61

这条线

res = os.system(sys.argv(1)) sys.argv(2)
Run Code Online (Sandbox Code Playgroud)

在某些方面是错误的.

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

sys.argv[1]
sys.argv[2]
Run Code Online (Sandbox Code Playgroud)

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

第三,你需要用逗号分隔参数,一个简单的空间不会这样做.

你的最后一行应该是这样的:

res = os.system(sys.argv[1], sys.argv[2])
Run Code Online (Sandbox Code Playgroud)


Spe*_*bun 29

使用argparse库这是一个更好的方法.该特使包装库,使更容易地工作,为好.

一个简单的例子:

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))
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 这绝不是矫枉过正的.实用程序脚本有一种成为永久生产功能的方法. (4认同)
  • @delnan它解决了很多问题,我认为最好只是咬紧牙关并学习它.我还添加了一些关于使用`envoy`而不是`os.command`的内容,因为我错过了原来的问题. (3认同)
  • 一般同意(argparse很棒),虽然对于初学者的写作脚本来说,它可能有点过分. (2认同)

Fat*_*ror 8

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

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