Python dòng lệnh argparse không có đối số


345

Làm cách nào để thêm một cờ tùy chọn vào dòng lệnh args của tôi?

ví dụ. để tôi có thể viết

python myprog.py 

hoặc là

python myprog.py -w

Tôi đã thử

parser.add_argument('-w')

Nhưng tôi chỉ nhận được một thông báo lỗi nói

Usage [-w W]
error: argument -w: expected one argument

mà tôi lấy nó có nghĩa là nó muốn một giá trị đối số cho tùy chọn -w. Cách chấp nhận một lá cờ là gì?

Tôi đang tìm kiếm http://docs.python.org/l Library /argparse.html khá mờ đối với câu hỏi này.


4
Nếu bạn chỉ muốn 1 cờ cho tập lệnh của mình, sys.argv sẽ dễ dàng hơn rất nhiều. Trừ khi bạn đặc biệt cố gắng học argparse, điều này là tốt bởi vì nó là một mô-đun tiện dụng để biết.
chown

2
Ngay cả sau khi tôi biết câu trả lời bây giờ tôi cũng không thấy làm thế nào tôi có thể hiểu nó từ tài liệu.
Andreas Haferburg

Câu trả lời:


531

Như bạn đã có, đối số w đang mong đợi một giá trị sau -w trên dòng lệnh. Nếu bạn chỉ muốn lật một công tắc bằng cách đặt một biến Truehoặc False, hãy xem http://docs.python.org/dev/l Library /argparse.html # action (cụ thể là store_true và store_false)

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-w', action='store_true')

action='store_true'ngụ ý ở đâu default=False.

Ngược lại, bạn có thể có action='store_false', ngụ ý default=True.


3
@Jdog, Bạn có biết tại sao điều này không hiệu quả với tôi không? Các wluôn False.
Iulian Onofrei

52

Thêm một đoạn nhanh để sẵn sàng thực hiện:

Nguồn: myparser.py

import argparse
parser = argparse.ArgumentParser(description="Flip a switch by setting a flag")
parser.add_argument('-w', action='store_true')

args = parser.parse_args()
print args.w

Sử dụng:

python myparser.py -w
>> True

-10

Đây là một cách nhanh chóng để làm điều đó, sẽ không yêu cầu bất cứ điều gì ngoài sys.. mặc dù chức năng bị hạn chế:

flag = "--flag" in sys.argv[1:]

[1:] trong trường hợp nếu tên tập tin đầy đủ là --flag


13
Chỉ cần đăng nhập đơn giản để diễn tả cách BAD một ý tưởng này về lâu dài. Hãy tưởng tượng rằng bạn bắt đầu bằng cách kiểm tra xem chuỗi "--flag" có trong sys.argv không. Sau đó, bạn nhìn vào phần cuối của sys.argv [-1] để xem tệp nào sẽ mở. Bỗng nhiên bạn gặp phải một tình huống nếu bạn cố mở một tệp có tên --flagthì nó sẽ hoạt động bất ngờ, và điều tồi tệ hơn là điều này thường kết thúc là một lỗ hổng bảo mật, khi dữ liệu không đáng tin kết thúc truyền cho argv. Cuối cùng, phương pháp này không nên được thực hiện. Các trình phân tích cú pháp thực sự mạnh mẽ hơn nhiều ...
timthelion

3
Như đã đề cập, giải pháp này hoàn toàn không mạnh mẽ, nhưng nó hoạt động nếu bạn cần nó được thực hiện siêu nhanh (ví dụ cho mục đích thử nghiệm). Chắc chắn giữ nó ra khỏi mã sản xuất.
Jonathan Sudiaman
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.