2014-12-10 15 views
6

Ich möchte so etwas wie dies zu tun:Argumente, die auf andere Argumente mit argparse abhängig sind

-LoadFiles 
    -SourceFile "" -DestPath "" 
    -SourceFolder "" -DestPath "" 
-GenericOperation 
    -SpecificOperation -Arga "" -Argb "" 
    -OtherOperation -Argc "" -Argb "" -Argc "" 

Ein Benutzer sollte laufen können Dinge wie:

-LoadFiles -SourceFile „somepath“ -DestPath "somepath"

oder

-LoadFiles -SourceFolder "somepath" -DestPath "somepath"

Wenn Sie -LoadFiles haben, müssen Sie grundsätzlich entweder - SourceFile oder - SourceFolder haben. Wenn Sie -SourceFile haben, müssen Sie -DestPath usw. haben.

Ist diese Kette von erforderlichen Argumenten für andere Argumente möglich? Wenn nicht, kann ich zumindest etwas tun, wenn Sie -SourceFile haben, müssen Sie -DestPath haben?

+1

erforscht http://bugs.python.org/issue11588 Möglichkeiten des Hinzufügens allgemeine Interdependenz Tests, aber bis das umgesetzt wird, ist Ihre beste Wette ist, die Prüfung selbst zu tun, nach dem Parsen. – hpaulj

Antwort

5

Nachdem Sie parse_args auf der ArgumentParser Instanz rufen Sie erstellt haben, wird es Ihnen ein Namespace Objekt. Überprüfe einfach, ob eines der Argumente vorhanden ist und dass das andere auch da sein muss. Wie:

args = parser.parse_args() 
if ('LoadFiles' in vars(args) and 
    'SourceFolder' not in vars(args) and 
    'SourceFile' not in vars(args)): 

    parser.error('The -LoadFiles argument requires the -SourceFolder or -SourceFile') 
0

Hier ist ein Beispiel, das, falls Sie --akeDependency angeben, zwingt Sie, --dependency mit einem Wert anzugeben.

Dies wird nicht nur von argparse getan, sondern auch vom Programm, das später validiert, was der Benutzer angegeben hat.

#!/usr/bin/env python 
import argparse 
import sys 

parser = argparse.ArgumentParser() 
parser.add_argument('--makeDependency', help='create dependency on --dependency', action='store_true') 
parser.add_argument('--dependency', help='dependency example') 

args = parser.parse_args() 

if args.makeDependency and not args.dependency: 
    print "error on dependency" 
    sys.exit(1) 

print "ok!" 
Verwandte Themen