子流程.Popen可选参数

2024-09-25 14:26:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个python脚本,它使用用户提供的参数来启动可执行文件:

parser = argparse.ArgumentParser()
parser.add_argument('-c', '--stringC', dest="stringC", help="stringC", type=str)
parser.add_argument('-f', '--stringF', dest="stringF", help="stringF", type=str)
parser.add_argument('-o', '--stringO', dest="stringO", help="stringO", type=str)
parser.add_argument('-d', '--stringD', dest="stringD", help="stringD", type=str)
parser.add_argument('-s', '--stringS', dest="stringS", help="stringS", type=str)
args = parser.parse_args()

command = 'executable-location'
statement = [command, '-c', stringC, '-f', stringF, '-o', stringO, '-d', stringD, '-s', stringS]
p = subprocess.Popen(statement)

问题是其中一些参数对于可执行文件是可选的,如果没有提供,程序将使用自己的默认值。所以目前所有的参数都被使用了,尽管我有时想使用默认值。在

理想情况下,我只想给可执行文件解析的参数。我试过了

^{pr2}$

以及

p = subprocess.Popen(args)

但它给了我以下错误:

TypeError: 'Namespace' object is not iterable

希望有人能帮我。提前谢谢。在


Tags: add可执行文件parser参数typehelpargsargument
2条回答

如果可行,最简单的解决方案是将程序默认值合并到解析器中。在

# For example
parser.add_argument('-f', ' stringF', dest="stringF",
                    help="stringF", type=str,
                    default="-f's default)

那么您就不必担心是否在参数列表中使用args.stringF。在

否则,您需要一次生成一个命令列表选项。在

^{pr2}$

我不完全确定你想做什么,但这可能会有帮助:

使用两种不同的默认值定义解析器:

>>> import argparse
>>> parser=argparse.ArgumentParser()
>>> parser.add_argument('-f',' foo',default='FOO')
>>> parser.add_argument('-b',' bar',default=argparse.SUPPRESS)

分析不带任何参数的事例。注意,生成的名称空间有一个foo的值(这是默认值),但是bar没有值-这是因为SUPPRESS的默认值。在

^{pr2}$

args.foo将给出字符串“FOO”。但也可以将名称空间转换为字典或元组列表

>>> print(vars(args))
{'foo': 'FOO'}
>>> print(vars(args).items())
[('foo', 'FOO')]

如果我给两个参数args名称空间是如何产生的:

>>> args=parser.parse_args(['-f','val1','-b','val2'])
>>> print(args)
Namespace(bar='val2', foo='val1')

同样的字典和列表转换是可能的。在

>>> print(vars(args).items())
[('foo', 'val1'), ('bar', 'val2')]

您可以选择args是否包含合理的默认值,或者根本不包含用户没有给出的参数值。默认的defaultNone,这也很容易测试(例如args.baz is None)。在

构造一个简单的列表

['command', 'foo', 'val1', 'bar', 'val2']

应该是直截了当的。使用-f-b而不是默认的dest名称会更加麻烦。在

相关问题 更多 >