Nhận tiểu ban được chọn với argparse


129

Khi tôi sử dụng các lệnh con với python argparse, tôi có thể nhận được các đối số đã chọn.

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, argskhông chứa 'foo'. Đơn giản là viết sys.argv[1]không hoạt động vì có thể tranh luận toàn cầu. Làm thế nào tôi có thể có được tiểu ban?

Câu trả lời:


184

Phần dưới cùng của tài liệu Python trên các lệnh phụ argparse giải thích cách thực hiện việc 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 set_defaults()phương thức được tham chiếu ngay phía trên ví dụ tôi tìm thấy.


5
Tôi cũng muốn thêm required=Trueđể buộc người dùng sử dụng một tiểu ban.
Ben

14

ArgumentParser.add_subparsersdestđối số chính thức được mô tả là:

dest- tên của thuộc tính mà theo đó tên lệnh phụ sẽ được lưu trữ; theo mặc định Nonevà không có giá trị nào được lưu trữ

Trong ví dụ dưới đây về cách bố trí chức năng nhiệm vụ đơn giản bằng cách sử dụng các bộ con, bộ con được chọn nằm trong parser.parse_args().subparser.

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.