2013-06-12 39 views
27

Tôi đã tìm kiếm thông qua tất cả các ví dụ subparser ở đây và nói chung nhưng dường như không thể tìm ra điều đơn giản này.Làm thế nào để sử dụng argpse subparsers một cách chính xác?

Tôi có hai loại var trong đó có một loại có ràng buộc nên suy nghĩ con subparser là con đường để đi. ví dụ. -t cho phép "A" hoặc "B". Nếu người dùng vượt qua "A" thì họ cũng được yêu cầu cũng phải chỉ định nếu đó là "a1" hoặc "a2". Nếu họ chỉ vượt qua "B" thì không có gì.

Tôi có thể làm điều này và có argparse trả lại cho tôi loại "A" nào được chuyển hoặc nếu nó chỉ là "B"?

Phần bên dưới dường như hoạt động nhưng vì một số lý do bị hỏng khi truyền bất kỳ nội dung gì sau phân đoạn.

ví dụ: từ một thiết bị đầu cuối linux

>> python test01.py -t A a1 -v 61 

lỗi với ...

usage: test01.py a1 [-h] 
test01.py a1: error: unrecognized arguments: -v 

Hy vọng rằng có ý nghĩa.

Mã:

import argparse 

parser = argparse.ArgumentParser() 
subparsers = parser.add_subparsers(help='types of A') 

parser.add_argument("-t", 
        choices = ["A", "B"], 
        dest = "type", 
        required=True, 
        action='store', 
        help="Some help blah blah") 

cam_parser = subparsers.add_parser('a1', help='Default') 
cam_parser.set_defaults(which='a1') 

cam_parser = subparsers.add_parser('a2', help='parse this instead of default') 
cam_parser.set_defaults(which='a2') 


parser.add_argument("-v", 
        nargs = '+', 
        required=True, 
        dest = "version", 
        type=int, 
        action='store', 
        help="some version help blah blah") 

argument = parser.parse_args() 

print argument.type 
print argument.version 

Trả lời

26

Subparsers được gọi dựa trên giá trị của vị trí số đầu tiên, vì vậy cuộc gọi của bạn sẽ trông như thế

python test01.py A a1 -v 61 

Các "A" gây nên các subparser thích hợp , sẽ được xác định để cho phép đối số vị trí và tùy chọn -v.

argparse không khác áp đặt bất kỳ hạn chế về trình tự, trong đó lập luận và các tùy chọn có thể xuất hiện, và không có cách nào đơn giản để sửa đổi những gì đối số/options thể xuất hiện một lần phân tích đã bắt đầu (một cái gì đó liên quan đến hành động tùy chỉnh mà sửa đổi trường hợp phân tích cú pháp có thể làm việc), bạn nên xem xét việc thay thế -t bản thân:

import argparse 

parser = argparse.ArgumentParser() 
subparsers = parser.add_subparsers(help='types of A') 
parser.add_argument("-v", ...) 

a_parser = subparsers.add_parser("A") 
b_parser = subparsers.add_parser("B") 

a_parser.add_argument("something", choices=['a1', 'a2']) 

Kể từ -v được định nghĩa cho phân tích cú pháp chính, nó phải được xác định trước khi lập luận rằng quy định cụ thể mà subparser được sử dụng để duy trì đối số ing.

+1

cảm ơn bạn rất nhiều. Tuy nhiên tôi vẫn nhận được một lỗi khi tôi thông qua -v vì một lý do nào đó nghĩa là nó mong đợi -v và khi tôi đã vượt qua nó tôi đã nhận lỗi cũ của tôi "đối số không được công nhận". Ngay cả khi tôi vượt qua nó trước các lập luận vị trí. Bất kỳ ý tưởng? Tôi đã cố gắng tìm một ví dụ tương tự nhưng không có nhiều may mắn. – user1571144

+0

là 'trước khi đối số xác định subparser' tham chiếu đến mã của người dùng nhập đối số hoặc cả hai? – Nickpick

+0

Nó xuất hiện thực hiện 'nhóm1 = parser.add_subparsers (help = 'subparser nhóm 1')' và 'group2 = parser.add_subparsers (help = 'subparser nhóm 2')' cho 'lỗi: không thể có nhiều đối số subparser' lỗi. Tôi đã hy vọng sử dụng nó để nhóm các tiểu ban. –