2016-04-04 21 views
0

私は実行可能ファイルを起動するために、ユーザによって与えられた引数を使用してPythonスクリプトを作成しています:subprocess.Popenオプションの引数

問題は、これらのパラメータのいくつかは、実行のためにしている場合、オプションであるということです
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

がうまくいけば、誰かがこれで私を助けることができます。前もって感謝します。

答えて

0

実行可能であれば、プログラムのデフォルトをパーサーに組み込むのが最も簡単な解決策です。

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

次に、引数リストにargs.stringFを使用するかどうかを心配する必要はありません。

それ以外の場合は、コマンドリストを1つずつ作成する必要があります。

statement = [command] 
if args.stringF is not None: 
    statement += ["-f", args.StringF] 
# etc 
+0

ありがとうございました。プログラムのデフォルト値が変更されるたびにスクリプトを更新する必要がないので、2番目のオプションを使用することにしました。 – Aelion

0

私はあなたがやろうとしているものに関しては全くわからないんだけど、これが役立つことがあります

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

はデフォルト値の2種類で、パーサを定義します

引数なしで1つのケースを解析します。結果として得られる名前空間はfoo(デフォルト)の値を持ちますが、barの値はありません。つまり、デフォルトの​​です。

>>> args=parser.parse_args([]) 
>>> print(args) 
Namespace(foo='FOO') 

args.fooは、文字列 'FOO'を返します。

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

と同じ辞書やリスト:しかし、あなたはまた、私は、引数のカップルにargs名前空間を与える場合はどのように持っている辞書に、またはタプル

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

のリストに名前空間を変換することができます変換が可能です。

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

それはargsは、合理的なデフォルト、またはユーザーが与えるものではありません。引数の値がまったく含まれているかどうかについてのあなたの選択です。 defaultのデフォルト値はNoneであり、テストも容易です(例:args.baz is None)。

まっすぐでなければなりません

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

のような単純なリストを構築します。 destのデフォルト値の代わりに-f-bを使用すると、もう少し手間がかかります。

関連する問題