subprocess.Popen 个可选参数
subprocess.Popen optional arguments
我正在创建一个 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)
问题是其中一些参数对于可执行文件是可选的,如果未提供,程序将使用自己的默认值。所以目前所有参数都被使用,即使我有时想使用默认值。
理想情况下,我只想为可执行文件提供已解析的参数。我试过了
statement = [command, args]
p = subprocess.Popen(statement2)
和
p = subprocess.Popen(args)
但它给了我以下错误:
TypeError: 'Namespace' object is not iterable
希望有人能帮我解决这个问题。提前致谢。
最简单的解决方案(如果可行)是将程序默认值合并到您的解析器中。
# For example
parser.add_argument('-f', '--stringF', dest="stringF",
help="stringF", type=str,
default="-f's default)
那你就不用纠结要不要在参数列表中使用args.stringF
了
否则,您需要一次构建命令列表一个选项。
statement = [command]
if args.stringF is not None:
statement += ["-f", args.StringF]
# etc
我不完全确定你要做什么,但这可能会有所帮助:
定义一个解析器,有两种不同的默认值:
>>> import argparse
>>> parser=argparse.ArgumentParser()
>>> parser.add_argument('-f','--foo',default='FOO')
>>> parser.add_argument('-b','--bar',default=argparse.SUPPRESS)
解析一个没有任何参数的案例。请注意,生成的命名空间具有 foo
的值(默认值),但 none 用于 bar
- 这是因为 SUPPRESS
默认值。
>>> args=parser.parse_args([])
>>> print(args)
Namespace(foo='FOO')
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
是否包含合理的默认值,或者对于用户未提供的参数根本没有值。默认的 default
是 None
,这也很容易测试(例如 args.baz is None
)。
构造一个像
这样的简单列表
['command', 'foo', 'val1', 'bar', 'val2']
应该直截了当。使用 -f
和 -b
而不是默认的 dest
名称会花费更多时间。
我正在创建一个 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)
问题是其中一些参数对于可执行文件是可选的,如果未提供,程序将使用自己的默认值。所以目前所有参数都被使用,即使我有时想使用默认值。
理想情况下,我只想为可执行文件提供已解析的参数。我试过了
statement = [command, args]
p = subprocess.Popen(statement2)
和
p = subprocess.Popen(args)
但它给了我以下错误:
TypeError: 'Namespace' object is not iterable
希望有人能帮我解决这个问题。提前致谢。
最简单的解决方案(如果可行)是将程序默认值合并到您的解析器中。
# For example
parser.add_argument('-f', '--stringF', dest="stringF",
help="stringF", type=str,
default="-f's default)
那你就不用纠结要不要在参数列表中使用args.stringF
了
否则,您需要一次构建命令列表一个选项。
statement = [command]
if args.stringF is not None:
statement += ["-f", args.StringF]
# etc
我不完全确定你要做什么,但这可能会有所帮助:
定义一个解析器,有两种不同的默认值:
>>> import argparse
>>> parser=argparse.ArgumentParser()
>>> parser.add_argument('-f','--foo',default='FOO')
>>> parser.add_argument('-b','--bar',default=argparse.SUPPRESS)
解析一个没有任何参数的案例。请注意,生成的命名空间具有 foo
的值(默认值),但 none 用于 bar
- 这是因为 SUPPRESS
默认值。
>>> args=parser.parse_args([])
>>> print(args)
Namespace(foo='FOO')
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
是否包含合理的默认值,或者对于用户未提供的参数根本没有值。默认的 default
是 None
,这也很容易测试(例如 args.baz is None
)。
构造一个像
这样的简单列表['command', 'foo', 'val1', 'bar', 'val2']
应该直截了当。使用 -f
和 -b
而不是默认的 dest
名称会花费更多时间。