2016-04-04 27 views
0

Bir yürütülebilir başlatmak için kullanıcı tarafından verilen argümanlar kullanan bir piton komut dosyası oluşturma:subprocess.Popen isteğe bağlı bağımsız değişkenler

sorun bu parametrelerin bazıları yürütülebilir ve eğer isteğe olmasıdır
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) 

sağlanmayan program kendi varsayılan değerlerini kullanır. Öyleyse, bazen varsayılan değerleri kullanmak istediğim halde tüm parametreler kullanılır.

İdeal olarak, yalnızca ayrıştırılan bağımsız değişkenleri çalıştırmak istiyorum. Ben

statement = [command, args] 
p = subprocess.Popen(statement2) 

ve

p = subprocess.Popen(args) 

denedi ama bana şu hatayı veriyor:

TypeError: 'Namespace' object is not iterable

Umarım birileri bana bu konuda yardımcı olabilir. Şimdiden teşekkürler.

cevap

0

Mümkün olan en basit çözüm, program varsayılanlarını ayrıştırıcınıza dahil etmektir.

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

Sonra argüman listesindeki args.stringF kullanmak olsun veya olmasın endişelenmenize gerek yoktur. Aksi takdirde, her seferinde komut listesini bir seçenek oluşturmanız gerekir.

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

Teşekkür ederim, programın varsayılan değerleri her değiştiğinde betiği güncellemek istemediğim için ikinci seçeneğe gitmeye karar verdim. – Aelion

0

Ne yapmaya çalışıyorsunuz ne olduğu tamamen emin değilim, ama bu yardımcı olacaktır çekebilir:

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

varsayılan değerler 2 farklı türde, bir ayrıştırıcı tanımlamak

Herhangi bir argüman olmadan bir vaka ayrıştır. Ortaya çıkan Namespace'in foo (varsayılan değer) için bir değere sahip olduğunu, ancak bar için hiçbiri olmadığını unutmayın - bu, SUPPRESS varsayılanı nedeniyle.

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

args.foo dize 'FOO' verecek. Ben bağımsız değişkenlerin bir ikiliye args ad verirsek Ama aynı zamanda bir sözlüğe ad dönüştürmek veya küpe

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

listesine nasıl bulunur:

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

ve aynı sözlüğü ve listeyi dönüşüm mümkündür.

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

O args makul varsayılan ya da hiç argümanlar için kullanıcı vermez hiçbir değeri içeren olmadığı konusunda sizin seçiminiz. Varsayılan default, ayrıca test edilmesi kolay olan None'dur (ör. args.baz is None).

sağlıyor olmalı

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

gibi basit bir liste oluşturulması. Varsayılan dest adlarını kullanmak yerine -f ve -b kullanmak biraz daha işe yarayacaktır.

İlgili konular