可选择将参数传递给python中的子进程

时间:2014-11-19 13:40:50

标签: python subprocess command-line-arguments

在我的脚本中,我使用可选的命令行参数调用可执行文件(如果传递,则此参数将打开可执行文件中的函数,默认情况下处于关闭状态)。我想直接从脚本本身的参数控制这个选项。现在写我做:

import subprocess
option = False
if option:
    check = subprocess.Popen(['executable', '--option'])
else:
    check = subprocess.Popen(['executable'])

我试图找到一种更紧凑的方式:

import subprocess
option = False
check = subprocess.Popen(['executable', '--option' if option else ''])

但这会引发错误"未知选项"确切地说。

这会在python中引发错误:

import subprocess
option = False
check = subprocess.Popen(['executable', '--option' if option else None])

所以,我的问题是:有没有办法将可选参数传递给一行中的子进程?

2 个答案:

答案 0 :(得分:2)

使用列表切片:

>>> ['executable', '--option'][:1 + False]
['executable']
>>> ['executable', '--option'][:1 + True]
['executable', '--option']

>>> False == 0
True
>>> True == 1
True

check = subprocess.Popen(['executable', '--option'][:1 + option])

<强>更新 备选

您还可以使用list * bool

>>> ['a'] * True
['a']
>>> ['a'] * False
[]

使用此功能,您可以组合多个选项:

check = subprocess.Popen(['executable'] +
                         ['-option1'] * option1 +
                         ['-option2'] * option2)

答案 1 :(得分:1)

IMO比当前建议更具可读性的一种方法是使用列表拆包:

*(['--opt=val'] if opt else [])

以您的示例为例:

check = subprocess.Popen([
    'executable',
    *(['--option'] if option else [])
])