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.
sys.argv是一个列表,并使用方括号索引,例如sys.argv[1].您也可以len(sys.argv)在索引之前进行检查.
此外,如果您想要传递参数os.system(),您可能需要类似的东西os.system(' '.join(sys.argv[1:])),但这对于带空格的参数不起作用.你最好使用子进程模块.
| 归档时间: |
|
| 查看次数: |
61500 次 |
| 最近记录: |