Cập nhật: Câu trả lời này vẫn còn vấn đề; ví dụ, nó không thể xử lý các required
đối số và yêu cầu một cú pháp cấu hình khó hiểu. Thay vào đó, ConfigArgParse dường như là chính xác những gì câu hỏi này yêu cầu và là một sự thay thế trong suốt, trong suốt.
Một vấn đề với hiện tại là nó sẽ không lỗi nếu các đối số trong tệp cấu hình không hợp lệ. Đây là một phiên bản có một nhược điểm khác: bạn sẽ cần bao gồm tiền tố --
hoặc -
trong các phím.
Đây là mã python ( liên kết Gist với giấy phép MIT):
import argparse
import configparser
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--config_file', help='config file')
args, left_argv = parser.parse_known_args()
if args.config_file:
with open(args.config_file, 'r') as f:
config = configparser.SafeConfigParser()
config.read([args.config_file])
parser.add_argument('--arg1', help='argument 1')
parser.add_argument('--arg2', type=int, help='argument 2')
for k, v in config.items("Defaults"):
parser.parse_args([str(k), str(v)], args)
parser.parse_args(left_argv, args)
print(args)
Đây là ví dụ về tệp cấu hình:
[Defaults]
--arg1=Hello!
--arg2=3
Bây giờ, đang chạy
> python main.py --config_file config_correct.conf --arg1 override
Namespace(arg1='override', arg2=3, config_file='test_argparse.conf')
Tuy nhiên, nếu tệp cấu hình của chúng tôi có lỗi:
--arg1=Hello!
--arg2='not an integer!'
Chạy tập lệnh sẽ tạo ra lỗi, như mong muốn:
> python main.py --config_file config_invalid.conf --arg1 override
usage: test_argparse_conf.py [-h] [--config_file CONFIG_FILE] [--arg1 ARG1]
[--arg2 ARG2]
main.py: error: argument --arg2: invalid int value: 'not an integer!'
Nhược điểm chính là điều này sử dụng parser.parse_args
hơi khó khăn để nhận được kiểm tra lỗi từ ArgumentParser, nhưng tôi không biết bất kỳ giải pháp thay thế nào cho điều này.