2016-04-22 9 views
0

bekommt Ich versuche, eine Fahne, um ein Programm zu übernehmen:Kann nicht wahr/falsch Wert von der Kommandozeile in Python 2.7

python2.7 hello.py --showxy 

und argparse geben mir Mühe.

dies ist mein Beispiel Testcode:

import os 
import sys 
import argparse 

print (os.getcwd()) 
print ("___________________________________________________") 
print ("A: " + sys.argv[0]) 
print ("B: " + sys.argv[1]) 
print ("C: " + sys.argv[2]) 
print ("___________________________________________________") 


parser = argparse.ArgumentParser() 
parser.add_argument('--showxy', action='store_true') 
args = argparse.Namespace() 
d = vars(args) 


print Namespace() 

Und während ich sollte bekommen:

Namespace(showxy=True) 

Ich bin tatsächlich einen Fehler bekommen:

A: hello.py 
B: haarcascade_frontalface_default.xml 
C: euromil.jpg 
___________________________________________________ 
Traceback (most recent call last): 
    File "hello.py", line 19, in <module> 
    print Namespace() 

NameError: name 'Namespace' is not defined 

Wie soll ich sein? ormatting das?

+1

Warum glauben Sie, dass * * bekommen sollte? 'Namespace' steht unter' argparse' und Sie haben es bereits als 'argparse.Namespace()' aufgerufen. Warum sollte der Aufruf von 'Namespace' funktionieren? – idjaw

+0

Sie haben nicht einmal 'parser.parse_args()' aufgerufen. Warum versuchen Sie, 'Namespace' direkt aufzurufen? – user2357112

Antwort

1

Sie vermissen das Parsen Schritt

args = parser.parse_args() 

args = argparse.Namespace() gerade ein neues leeres Namespace Objekt erstellt.

argparse ist das Modul. parser ist das Objekt ArgumentParser. Namespace ist eine in diesem Modul definierte Klasse. parse_args erstellt ein Namespace, füllt es mit Werten, die es von sys.argv analysiert, und gibt es als args zurück.

Das Definieren der parser selbst führt kein Parsing durch.


Das erste Beispiel in der Dokumentation ist:

import argparse 

parser = argparse.ArgumentParser(description='Process some integers.') 
parser.add_argument('integers', metavar='N', type=int, nargs='+', 
        help='an integer for the accumulator') 
parser.add_argument('--sum', dest='accumulate', action='store_const', 
        const=sum, default=max, 
        help='sum the integers (default: find the max)') 

args = parser.parse_args() 
print(args.accumulate(args.integers)) 

Einige behaupten, das für Anfänger zu weit fortgeschritten ist, aber die wichtigsten Stücke sind.

parser = ... 
parser.add_argument... 
args = parser.parse_args() 
# look at args, print it, access attributes, etc. 

argparse.Namespace nicht https://docs.python.org/3/library/argparse.html#the-namespace-object

bis Abschnitt erwähnt
+0

Verstanden. Ist das vor oder nach dem Namensraum? – Rich

+1

Normalerweise müssen Sie keinen 'Namespace' selbst erstellen. 'parse_args' macht das für dich. (Sie können einen Namespace erstellen und ihn an parse_args übergeben, aber das ist eine erweiterte Verwendung). Möglicherweise müssen Sie die 'argparse'-Dokumente und/oder das Tutorial überprüfen. – hpaulj

+0

Ok, jetzt habe ich: '" AttributeError: 'Modul' Objekt hat kein Attribut 'parse_args'' – Rich