【问题标题】:Optionally pass argument to subprocess in python可选地将参数传递给python中的子进程
【发布时间】:2015-01-17 01:22:54
【问题描述】:

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

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

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

【问题讨论】:

    标签: python subprocess command-line-arguments


    【解决方案1】:

    IMO 比当前建议更具可读性的替代方法是使用列表解包:

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

    还有你的例子:

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

    【讨论】:

      【解决方案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)
      

      【讨论】:

      • 如果有多个这样的选项(例如可执行文件 [--option1] [--option2] ...)?
      • @Roman, 假设option 变量是一个布尔对象,你可以使用替代list * bool: subprocess.Popen(['executable'] + ['-option1'] * option1 + ['-option2'] * option2)
      猜你喜欢
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      • 2018-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多