mô-đun argparse Làm thế nào để thêm tùy chọn mà không có bất kỳ đối số?


165

Tôi đã tạo ra một kịch bản bằng cách sử dụng argparse.

Tập lệnh cần lấy tên tệp cấu hình làm tùy chọn và người dùng có thể chỉ định liệu họ có cần tiến hành hoàn toàn tập lệnh hay chỉ mô phỏng nó.

Các đối số được thông qua: ./script -f config_file -shoặc ./script -f config_file.

Nó ổn đối với phần -f config_file, nhưng nó cứ hỏi tôi về các đối số cho -s là tùy chọn và không nên theo sau bởi bất kỳ.

Tôi đã thử điều này:

parser = argparse.ArgumentParser()
parser.add_argument('-f', '--file')
#parser.add_argument('-s', '--simulate', nargs = '0')
args = parser.parse_args()
if args.file:
    config_file = args.file
if args.set_in_prod:
        simulate = True
else:
    pass

Với các lỗi sau:

File "/usr/local/lib/python2.6/dist-packages/argparse.py", line 2169, in _get_nargs_pattern
nargs_pattern = '(-*%s-*)' % '-*'.join('A' * nargs)
TypeError: can't multiply sequence by non-int of type 'str'

Và cùng một lỗi với ''thay vì 0.

Câu trả lời:


231

Như @Felix Kling đề xuất sử dụng action='store_true':

>>> from argparse import ArgumentParser
>>> p = ArgumentParser()
>>> _ = p.add_argument('-f', '--foo', action='store_true')
>>> args = p.parse_args()
>>> args.foo
False
>>> args = p.parse_args(['-f'])
>>> args.foo
True

96

Để tạo một lựa chọn mà không cần giá trị, thiết lập action [tài liệu] của nó để 'store_const', 'store_true'hoặc 'store_false'.

Thí dụ:

parser.add_argument('-s', '--simulate', action='store_true')

Xin chào; Cảm ơn câu trả lời của bạn. Tôi đã thử như được giải thích trong tài liệu: >>> Parser.add_argument ('- foo', '-f', action = 'store_true') _StoreTrueAction (tùy chọn_strings = ['- foo', '-f'], Dest = 'foo', nargs = 0, const = True, default = false, type = none, tests = none, help = none, metavar = none) >>> Parser.parse_args () Namespace (foo = false) >> > print args.foo TracBack (cuộc gọi gần đây nhất): Tệp "<stdin>", dòng 1, trong <module> AttributionError: 'Namespace' object không có thuộc tính 'foo' >>> `Điều này dường như không hoạt động; Tôi không biết cách lấy lại giá trị sau khi gán. Cảm ơn vì đã giúp tôi!
philippe

@philippe: bạn đã quên liên kết parser.parse_args()giá trị được trả về với args stackoverflow.com/questions/5262702/iêu
jfs

@philippe: args = parser.parse_args()như bạn đã có trong mã của mình. Bạn chỉ cần thay thế dòng nhận xét và sau đó bạn có thể truy cập giá trị với args.simulate.
Felix Kling
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.