2011-11-23 14 views
107

Bu bence kolay olmalı ama anlayamıyorum. argparse: hangi alt toplayıcının kullanıldığını tanımlayın

Aşağıdaki arparse ayrıştırıcı var varsayalım:

import argparse 

parser = argparse.ArgumentParser(version='pyargparsetest 1.0') 
subparsers = parser.add_subparsers(help='commands') 

# all 
all_parser = subparsers.add_parser('all', help='process all apps') 

# app 
app_parser = subparsers.add_parser('app', help='process a single app') 
app_parser.add_argument('appname', action='store', help='name of app to process') 
Ben belirleyebilir subparser kullanıldı Nasıl

? çağıran:

print parser.parse_args(["all"]) 

bana boş ad verir:

Namespace() 
+0

Bu soru IMHO daha iyi o zaman cevap orijinal olarak kabul birine sahip olacaktır. –

cevap

56

Düzenleme: benimkinden daha iyi ve kabul edilen cevabı olmalı bu soruya quornian's answer bakınız.

argparse documentation'a göre parser.parse_args(...) sonucu "yalnızca ana ayrıştırıcı ve seçili alt ayrıştırıcı için öznitelikleri içerir". Ne yazık ki bu, hangi alt ayrıştırıcının kullanıldığını belirlemek için yeterli bilgi olmayabilir. Bu sorunu çözmek için belge, alt ayrıştırıcıda set_defaults(...) yöntemini kullanmanızı önerir.

Örneğin, ben kodunuzu set_defaults() çağrıları ekledik: Şimdi çalıştırırsanız

import argparse 

parser = argparse.ArgumentParser(version='pyargparsetest 1.0') 
subparsers = parser.add_subparsers(help='commands') 

# all 
all_parser = subparsers.add_parser('all', help='process all apps') 
all_parser.set_defaults(which='all') 

# app 
app_parser = subparsers.add_parser('app', help='process a single app') 
app_parser.add_argument('appname', action='store', help='name of app to process') 
app_parser.set_defaults(which='app') 

sonuç

Namespace(which='all') 

Kontrol dışarı add_subparsers() olduğunu

print parser.parse_args(["all"]) 

Daha fazla bilgi için dokümantasyon ve başka bir örnek.

+5

'set_defaults', bir işlevin bir alt komutunu bağlamak için kullandığı dokümanın örneğinde olduğu gibi yararlıdır .. ama' add_parser (dest = 'hangi') 'bunu yapmak için" doğru "yol gibi görünüyor , – dbr

+1

@ dbr Yep alt komutunu tekrarlamayı gerektirmediğinden, haklısınız. Quornian'ın cevabı kabul edilen kişi olmalı. – srgerg

+0

@dbr, 'add_subparsers (dest = 'hangi')' – smac89

202

Daha basit bir çözüm, numaralı aramaya dest numaranızı eklemektir. o başlatıldığı subparser adını kontrol etmek gerekirse

[...], add_subparsers için hedef anahtar kelime argümanı() çağrısı

çalışacaktır: Bu daha aşağı documentation yılında biraz gömülür örnekte

değiştirin:

subparsers = parser.add_subparsers(help='commands') 

ile:

subparsers = parser.add_subparsers(help='commands', dest='command') 

Çalıştırmak Şimdi eğer:

print parser.parse_args(["all"]) 

Eğer

Namespace(command='all') 
+0

olmalıdır. Bu, başka bir argümanda 'dest' parametresi gibi çalıştığı için doğru yol gibi görünüyor (yalnızca varsayılan olarak "Yok" seçeneğidir, çekilmek yerine '- longopt' değerinden). 'Set_defaults' kullanımı bunun için uygun görünmüyor (ama diğer şeyler için yararlıdır) – dbr

+0

Doğru cevap bu! "Komut" değerini test etmek için bir örnek olması güzel olurdu. –

+0

BTW Eğer komutun adıyla aynı sınıfta işlev varsa, bunu yapabilirsiniz: "getattr (self, args.command)()" ismine göre yürütmek için! –

İlgili konular