2012-03-15 15 views
19

Có mô-đun Python nào để làm đối số dòng lệnh git-phong cách đá quý không? Ý nghĩa của phong cách gem/git là:các tham số dòng lệnh bằng đá quý/git trong Python

$ ./MyApp.py 
The most commonly used MyApp commands are: 
    add  Add file contents to the index 
    bisect  Find by binary search the change that introduced a bug 
    branch  List, create, or delete branches 
    checkout Checkout a branch or paths to the working tree 
    ... 

$ ./MyApp.py branch 
    * current-branch 
    master 

Không có đối số, đầu ra cho bạn biết cách bạn có thể tiếp tục. Và có một lệnh "trợ giúp" đặc biệt:

$ ./MyApp.py help branch 

Bạn sẽ tìm hiểu sâu hơn về lệnh "nhánh".

Edit: Và bởi làm Tôi có nghĩa là nó không in sử dụng cho bạn, lối thoát hiểm với đầu vào không hợp lệ, chạy chức năng của mình theo đặc điểm kỹ thuật CLI của bạn. Sắp xếp "Trình ánh xạ URL" cho dòng lệnh.

Trả lời

30

Có, argparse với add_subparser().

Tất cả đều được giải thích rõ ràng trong phần Sub-commands.

Sao chép một trong những ví dụ từ đó:

>>> parser = argparse.ArgumentParser() 
>>> subparsers = parser.add_subparsers() 
>>> checkout = subparsers.add_parser('checkout', aliases=['co']) 
>>> checkout.add_argument('foo') 
>>> parser.parse_args(['checkout', 'bar']) 
Namespace(foo='bar') 

Edit: Đáng tiếc là không có tự tạo ra đặc biệt help lệnh, nhưng bạn có thể nhận được thông báo giúp tiết (mà bạn dường như muốn) với -h hoặc --help như một bình thường sau khi lệnh:

$ ./MyApp.py branch --help 

By verbose tôi không có nghĩa là giống như một người đàn ông trang, nó giống như mỗikhácloại giúp đỡ: liệt kê tất cả các đối số, vv ...

Ví dụ:

>>> parser = argparse.ArgumentParser() 
>>> subparsers = parser.add_subparsers(description='Sub description') 
>>> checkout = subparsers.add_parser('checkout', description='Checkout description') 
>>> checkout.add_argument('foo', help='This is the foo help') 
>>> parser.parse_args(['checkout', '--help']) 
usage: checkout [-h] foo 

Checkout description 

positional arguments: 
    foo   This is the foo help 

optional arguments: 
    -h, --help show this help message and exit 

Nếu bạn cần, nó phải là dễ dàng để thực hiện một lệnh help đó chuyển hướng đến --help.

+0

Có thể đáng giá khi chỉ ra rằng từ khóa 'aliases' đến' subparsers.add_parser() 'là mới đối với Python 3 và không có sẵn trong Python 2.7. – Juan

+0

Cẩn thận với argparse: một khi bạn bắt đầu thêm các con subparsers lồng nhau, mọi thứ trở nên rất lộn xộn. Xem ví dụ: http://bugs.python.org/issue9253 – Federico

+0

Gói [nhấp chuột] (http://click.pocoo.org/) tuyệt vời cung cấp chức năng này ra khỏi hộp! Kiểm tra hướng dẫn * phức tạp * [tại đây] (http://click.pocoo.org/5/complex/) –

4

Một hack hợp lý để có được những viên ngọc/git phong cách "giúp đỡ" hành vi (tôi chỉ viết này cho những gì tôi đang làm việc trên anyway):

parser = argparse.ArgumentParser() 
subparsers = parser.add_subparsers(dest='sub_commands') 
parser_branch = subparsers.add_parser('branch', description='list of branches') 
parser_help = subparsers.add_parser('help') 
parser_help.add_argument('command', nargs="?", default=None) 

# I can't find a legitimate way to set a default subparser in the docs 
# If you know of one, please let me know! 
if len(sys.argv) < 2: 
    sys.argv.append('--help') 

parsed = parser.parse_args() 

if parsed.sub_commands == "help": 
    if not parsed.command: 
     parser.parse_args(['--help']) 
    else: 
     parser.parse_args([parsed.command, '--help']) 

argparse chắc chắn là một bước tiến từ optparse và khác python giải pháp tôi đã đi qua. Nhưng IMO phong cách đá quý/git của việc xử lý args chỉ là một cách hợp lý hơn và an toàn hơn để làm những việc như vậy nó gây phiền nhiễu mà nó không được hỗ trợ.

Các vấn đề liên quan