从python intepreter调用Python argparse

时间:2017-07-12 07:55:10

标签: python parsing arguments

我正在尝试使用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。

1 个答案:

答案 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.