อัปเดต: คำตอบนี้ยังคงมีปัญหา ตัวอย่างเช่นไม่สามารถจัดการกับrequired
อาร์กิวเมนต์และต้องใช้ไวยากรณ์การกำหนดค่าที่น่าอึดอัดใจ ConfigArgParseแทนดูเหมือนจะตรงกับสิ่งที่คำถามนี้ถามและเป็นการแทนที่แบบดรอปอินที่โปร่งใส
ปัญหาหนึ่งของกระแสคือจะไม่เกิดข้อผิดพลาดหากอาร์กิวเมนต์ในไฟล์กำหนดค่าไม่ถูกต้อง นี่คือเวอร์ชันที่มีข้อเสียแตกต่างกัน: คุณจะต้องใส่--
หรือ-
คำนำหน้าในคีย์
นี่คือรหัส python ( ลิงก์ Gistพร้อมใบอนุญาต 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)
นี่คือตัวอย่างของไฟล์กำหนดค่า:
[Defaults]
--arg1=Hello!
--arg2=3
ตอนนี้กำลังทำงาน
> python main.py --config_file config_correct.conf --arg1 override
Namespace(arg1='override', arg2=3, config_file='test_argparse.conf')
อย่างไรก็ตามหากไฟล์กำหนดค่าของเรามีข้อผิดพลาด:
--arg1=Hello!
--arg2='not an integer!'
การเรียกใช้สคริปต์จะทำให้เกิดข้อผิดพลาดตามต้องการ:
> 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!'
ข้อเสียหลักคือสิ่งนี้ใช้การparser.parse_args
แฮ็กค่อนข้างมากเพื่อรับการตรวจสอบข้อผิดพลาดจาก ArgumentParser แต่ฉันไม่ทราบทางเลือกอื่นใด