Python argparse bỏ qua các đối số không được công nhận


206

Optparse, phiên bản cũ chỉ bỏ qua tất cả các đối số không được nhận dạng và tiếp tục. Trong hầu hết các tình huống, điều này không lý tưởng và đã được thay đổi trong argparse. Nhưng có một vài tình huống mà bạn muốn bỏ qua mọi đối số không được nhận dạng và phân tích các đối số bạn đã chỉ định.

Ví dụ:

parser = argparse.ArgumentParser()
parser.add_argument('--foo', dest="foo")
parser.parse_args()

$python myscript.py --foo 1 --bar 2
error: unrecognized arguments: --bar

Có cách nào để ghi đè lên điều này?


14
Rất tiện lợi nếu bạn đang viết một trình bao bọc cho một chương trình khác và bạn muốn nắm bắt và sửa đổi một vài đối số, nhưng chuyển phần còn lại vào!
Alan De Smet

2
Chính xác là tại sao tôi lại kết thúc ở đây @AlanDeSmet! Vui mừng vì tôi không cố làm điều gì đó điên rồ :)
lùn

Câu trả lời:


350

Thay thế

args = parser.parse_args()

với

args, unknown = parser.parse_known_args()

Ví dụ,

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo')
args, unknown = parser.parse_known_args(['--foo', 'BAR', 'spam'])
print(args)
# Namespace(foo='BAR')
print(unknown)
# ['spam']

21
+1 - không biết có một số thứ nhưparse_known_args
avasal

7
Tôi cũng không! Tôi thậm chí đã bỏ lỡ nó trong docs docs.python.org/l Library / . Cảm ơn
joedborg

1
Điều này xuất hiện khi cố gắng sử dụng nosetest với Parsearss (nó từ chối cho phép nosetest args được sử dụng) lý do là vì tôi đang làm parser.parse_args(None)chứ không phải parser.parse_args([])trong các thử nghiệm của tôi.
Andy Hayden

3
FWIW, sử dụng parse_known_argsthay vì parse_argscho phép sử dụng ArgumentParsermã trong phạm vi if __name__ == 'main':(một điều kiện Truedành cho tất cả các ô trong IPython Notebook ... mà tôi thấy hỗ trợ rất nhiều cho mã phát triển và thử nghiệm mà cuối cùng tôi muốn chuyển sang tập lệnh được gọi từ một dòng lệnh)
cách giao thiệp

1
Điều này dường như không hoạt động với các đối số tùy chọn "được biết" không được thông qua.
Sharud

21

Bạn có thể đặt các phần còn lại vào một đối số mới parser.add_argument('args', nargs=argparse.REMAINDER)nếu bạn muốn sử dụng chúng.


1
Điều này hoạt động với parse_args()và không yêu cầu parse_known_args()(trên Python 2.7).
OozeMeister

4
Sử dụng argparse.REMAINDER dường như đầy rẫy những lỗi lâu đời. Tôi chắc chắn không thể làm cho nó hoạt động. parse_ Unknown_args () là một lựa chọn tốt.
Matt

1
Chỉ cần gặp phải một lỗi REMAINDER lâu dài ngày hôm nay: bug.python.org/su17050
Scott Carpenter

7

Thật ra argparse vẫn "mặc kệ" _unrecognized_args. Miễn là các đối số "không được nhận dạng" này không sử dụng tiền tố mặc định, bạn sẽ không nghe thấy khiếu nại nào từ trình phân tích cú pháp.

Sử dụng cấu hình của @ anutbu nhưng với tiêu chuẩn parse.parse_args(), nếu chúng ta thực hiện chương trình của mình với các đối số sau.

$ program --foo BAR a b +cd e

Chúng tôi sẽ có bộ sưu tập dữ liệu không gian tên này để làm việc.

Namespace(_unrecognized_args=['a', 'b', '+cd', 'e'], foo='BAR')

Nếu chúng tôi muốn tiền tố mặc định -bị bỏ qua, chúng tôi có thể thay đổi ArgumentParser và quyết định rằng chúng tôi sẽ sử dụng một +đối số "được công nhận" thay thế.

parser = argparse.ArgumentParser(prefix_chars='+')
parser.add_argument('+cd')

Lệnh tương tự sẽ tạo ra

Namespace(_unrecognized_args=['--foo', 'BAR', 'a', 'b'], cd='e')

Đặt nó trong đường ống của bạn và hút thuốc =)

Xin chào!

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.