我一直在玩subprocess.Popen
来执行一点程序但是却无法提出传递参数的正确方法。
这是一个应该执行我的程序的简化代码片段:
subprocess.Popen(shlex.split('dflat --portfolio jumpy --seed 1 --tables -n semi --elimination min-degree -e edge --default-join -p ../test_encodings/exchange.lp'))
shlex.split(...)
的输出:
['dflat', '--portfolio', 'jumpy', '--seed', '1', '--tables', '-n', 'semi', '--elimination', 'min-degree', '-e', 'edge', '--default-join', '-p', '../test_encodings/exchange.lp']
然而被叫程序没有告诉我我需要提供一个程序(-p
选项),我可以在上面看到它。
从shell运行命令完全正常。
答案 0 :(得分:1)
如果您能提供其他人可以运行的复制器(而不是需要非标准dflat
程序的东西),将会很有帮助。
一般来说,您发布的方法应该有效。也就是说,它更传统,更不容易出错,并且可以说是更容易理解,只是自己拆分数组。
subprocess.Popen([
'dflat',
'--portfolio', 'jumpy',
'--seed', '1',
'--tables',
'-n', 'semi',
'--elimination', 'min-degree',
'-e', 'edge',
'--default-join',
'-p', '../test_encodings/exchange.lp'])
手动执行此操作意味着您可以将每个选项本身作为参数放在具有该参数的行上,从而提高可读性。如果您的参数包含文字空格,引号等,这也意味着您可以避免引用问题。如果您只是将文字字符串作为第一个参数传递并使用shlex.split()
,则会给您一些问题。 shell=True
- 尽管不那么重要,因为您不必担心内容被误解为重定向字符,管道,复合命令,命令间接,& c。
答案 1 :(得分:0)
你问题中的命令似乎是正确的。确保您的代码使用完全相同的代码而不做任何更改。
我的猜测是--default-join
选项吃-p
参数。您可以通过在命令末尾移动--default-join
来测试它。
还要确保从正确的目录启动脚本。 -p
值是相对路径。检查文件是否可访问。