2012-10-11 14 views
70

Tôi muốn có một số tùy chọn trong mô-đun argparse như --pm-export tuy nhiên khi tôi cố gắng sử dụng nó như args.pm-export Tôi nhận được lỗi không có thuộc tính pm. Làm thế nào tôi có thể giải quyết vấn đề này? Có thể có - trong các tùy chọn dòng lệnh không?Có các tùy chọn trong argparse với dấu gạch ngang

Trả lời

90

Như indicated in the argparse docs:

Đối với những hành động đối số tùy chọn, giá trị của dest thường được suy ra từ các dây tùy chọn. ArgumentParser tạo giá trị của dest bằng cách lấy chuỗi tùy chọn dài đầu tiên và tước đi -- chuỗiban đầu ban đầu. Bất kỳ nội - nhân vật sẽ được chuyển đổi sang _ ký tự để đảm bảo chuỗi là một cái tên thuộc tính hợp lệ

Vì vậy, bạn nên sử dụng args.pm_export.

13

Dấu gạch ngang được chuyển đổi thành dấu gạch dưới:

import argparse 
pa = argparse.ArgumentParser() 
pa.add_argument('--foo-bar') 
args = pa.parse_args(['--foo-bar', '24']) 
print args # Namespace(foo_bar='24') 
+2

Chỉ dành cho đối số tùy chọn. Những người bắt buộc phải giữ dấu gạch ngang của họ, vì vậy yêu cầu dấu gạch dưới để làm cho chúng có thể truy cập được. – n00dle

54

Thật không may, dash-to-gạch thay thế không làm việc cho positionalarguments (không tiền tố bởi --) như

parser = argparse.ArgumentParser(description='Process some integers.') 
parser.add_argument('logs-dir', 
        help='Directory with .log and .log.gz files') 
parser.add_argument('results-csv', type=argparse.FileType('w'), 
        default=sys.stdout, 
        help='Output .csv filename') 
args = parser.parse_args() 
print args 

# gives 
# Namespace(logs-dir='./', results-csv=<open file 'lool.csv', mode 'w' at 0x9020650>) 

Vì vậy, bạn nên sử dụng lập luận 1'st để add_argument() như tên thuộc tính và metavar kwarg để đặt chế độ hiển thị trong trợ giúp:

parser = argparse.ArgumentParser(description='Process some integers.') 
parser.add_argument('logs_dir', metavar='logs-dir', 
        nargs=1, 
        help='Directory with .log and .log.gz files') 
parser.add_argument('results_csv', metavar='results-csv', 
        nargs=1, 
        type=argparse.FileType('w'), 
        default=sys.stdout, 
        help='Output .csv filename') 
args = parser.parse_args() 
print args 

# gives 
# Namespace(logs_dir=['./'], results_csv=[<open file 'lool.csv', mode 'w' at 0xb71385f8>]) 
+4

Báo cáo lỗi Python có liên quan: http://bugs.python.org/issue15125. 'argparse' sử dụng' setattr' và 'getattr', vì vậy các tên' dest' không phải là các tên thuộc tính 'dot' hợp lệ. Người dùng cũng có thể sử dụng 'getattr'. – hpaulj

+3

Tôi chỉ muốn 'positional_arg = getattr (parser, 'positional-arg')' –

+0

Chính xác những gì tôi cần - tôi đã làm nó ngược với 'metavar' và không thể hiểu tại sao nó không hoạt động. Cảm ơn! – dwanderson

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