2011-01-01 29 views
87

Khi tôi sử dụng các thư mục phụ với python argparse, tôi có thể nhận được các đối số đã chọn.Nhận tiểu ban được chọn với argparse

parser = argparse.ArgumentParser() 
parser.add_argument('-g', '--global') 
subparsers = parser.add_subparsers() 
foo_parser = subparsers.add_parser('foo') 
foo_parser.add_argument('-c', '--count') 
bar_parser = subparsers.add_parser('bar') 
args = parser.parse_args(['-g, 'xyz', 'foo', '--count', '42']) 
# args => Namespace(global='xyz', count='42') 

Vì vậy, args không chứa 'foo'. Đơn giản chỉ cần viết sys.argv[1] không hoạt động vì các args toàn cầu có thể. Làm thế nào tôi có thể nhận được subcommand chính nó?

Trả lời

135

Đáy rất của Python docs on argparse sub-commands giải thích làm thế nào để làm điều này:

>>> parser = argparse.ArgumentParser() 
>>> parser.add_argument('-g', '--global') 
>>> subparsers = parser.add_subparsers(dest="subparser_name") # this line changed 
>>> foo_parser = subparsers.add_parser('foo') 
>>> foo_parser.add_argument('-c', '--count') 
>>> bar_parser = subparsers.add_parser('bar') 
>>> args = parser.parse_args(['-g', 'xyz', 'foo', '--count', '42']) 
>>> args 
Namespace(count='42', global='xyz', subparser_name='foo') 

Bạn cũng có thể sử dụng phương pháp set_defaults() tham chiếu ngay trên ví dụ tôi tìm thấy.

3

Dưới đây là ví dụ về bố cục chức năng nhiệm vụ đơn giản.

import argparse 


def task_a(alpha): 
    print('task a', alpha) 


def task_b(beta, gamma): 
    print('task b', beta, gamma) 


if __name__ == '__main__': 
    parser = argparse.ArgumentParser() 
    subparsers = parser.add_subparsers(dest='subparser') 

    parser_a = subparsers.add_parser('task_a') 
    parser_a.add_argument(
     '-a', '--alpha', dest='alpha', help='Alpha description') 

    parser_b = subparsers.add_parser('task_b') 
    parser_b.add_argument(
     '-b', '--beta', dest='beta', help='Beta description') 
    parser_b.add_argument(
     '-g', '--gamma', dest='gamma', default=42, help='Gamma description') 

    kwargs = vars(parser.parse_args()) 
    globals()[kwargs.pop('subparser')](**kwargs) 
Các vấn đề liên quan