我正在尝试使用argparse模块从中提取参数,但是当使用python解释器调用时,天真的实现失败了:
1 import argparse
2 import sys
3
4 parser = argparse.ArgumentParser(description="some test program")
5 parser.add_argument('--some-option', action="store", dest="some_option")
6
7 parsed_args = parser.parse_args(sys.argv)
8 print(vars(parsed_args)
它失败了,因为它检测到第一个参数作为脚本的名称 - 在本例中为“test.py”:
~$: python3 ./test.py --some-option=5
usage: test.py [-h] [--some-option INPUT]
test.py: error: unrecognized arguments: ./test.py
我目前发现的解决方案是从搜索中搜索并删除python脚本名称,但这似乎是一个不优雅的黑客,如果第一个参数可以合法地成为python文件,则会出现问题:
1 import argparse
2 import sys
3
4 parser = argparse.ArgumentParser(description="some test program")
5 parser.add_argument('--some-option', action="store", dest="some_option")
6
7 print(sys.argv)
8 if sys.argv[0].find('.py') != -1:
9 args = sys.argv[1:]
10 else:
11 args = sys.argv
12
13 parsed_args = parser.parse_args(args)
14 print(vars(parsed_args)
使用argparse时有没有更好的方法摆脱那个讨厌的python文件名
注意:我无法摆脱对intepreter的调用,因为这是跨平台构建系统的一部分,因此有一个makefile,根据操作系统将python可执行文件设置为python3或python3.exe。
答案 0 :(得分:1)
sys.argv[0]
is always the name of the file. So if you do parsed_args = parser.parse_args(sys.argv[1:])
, you can be sure that you will always ignore the file name.
Per the python documentation:
sys.argv The list of command line arguments passed to a Python script. argv[0] is the script name (it is operating system dependent whether this is a full pathname or not). If the command was executed using the -c command line option to the interpreter, argv[0] is set to the string '-c'. If no script name was passed to the Python interpreter, argv[0] is the empty string.