Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python subprocess.Popen可选参数_Python_Popen_Argparse - Fatal编程技术网

Python subprocess.Popen可选参数

Python subprocess.Popen可选参数,python,popen,argparse,Python,Popen,Argparse,我正在创建一个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_argum

我正在创建一个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)

但它给了我以下错误:

TypeError:“命名空间”对象不可编辑


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

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

# 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
的值(这是默认值),但没有一个
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为None

构造一个简单的列表,如

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

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

谢谢,我决定使用第二个选项,因为我不想每次程序的默认值更改时都更新脚本。
['command', 'foo', 'val1', 'bar', 'val2']