当我运行parsePlotSens.py -s bw hehe
时,它表示hehe
是一个无法识别的参数。但是,如果我运行parsePlotSens.py hehe -s bw
,那就没关系。理想情况下,我希望它适用于这两种情况。
任何提示?以下是我的代码:
if __name__ == '__main__' :
parser = argparse.ArgumentParser(prog='parsePlotSens');
parser.add_argument('-s', '--sort', nargs =1, action = 'store', choices = ['mcs', 'bw'], default='mcs', help=sorthelp)
parser.add_argument('filename', nargs ='+', action = 'store')
option = parser.parse_args(sys.argv)
答案 0 :(得分:43)
不要将sys.argv
作为参数传递给parse_args
。只需使用
option = parser.parse_args()
如果您确实将sys.argv
传递给parse_args
,那么脚本本身的路径或名称就是sys.argv
中的第一项,因此成为option.filename
的值。 hehe
然后变成一个未知的参数。
如果省略sys.argv
,则parse_args
按预期解析sys.argv
。
答案 1 :(得分:10)
您可以通过允许未知参数来解决这个问题
替换
args = parser.parse_args()
带
args, unknown = parser.parse_known_args()
答案 2 :(得分:4)
此外,作为unutbu答案的补充,以这种方式将参数存储在字典中可以使测试变得简单:
args = vars(parser.parse_args())
print args
打印字典:
{'sort': ['bw'], 'filename': ['hehe']}
喜欢:
if args['sort'] == 'bw':
# code here
...
答案 3 :(得分:1)
要在此处完成此answer,我提供了一个示例来获取和解析未知参数:
import argparse
parser = argparse.ArgumentParser()
# we only have a know argument as key-pair --known KNOWN
parser.add_argument('--known')
# test with known un unknown variables
args, unknown = parser.parse_known_args(["--known", "var", "--unknown", "bar", "--flag"])
unknown
返回类似于["--unknown", "bar", "--flag"]
的列表。我们只需要解析它:
keypairs = dict([unknown[i:i+2] for i in range(0, len(unknown), 1) if unknown[i].startswith("--") and not (unknown[i+1:i+2]+["--"])[0].startswith("--")])
flags = [unknown[i] for i in range(0, len(unknown), 2) if (unknown[i+1:i+2]+["--"])[0].startswith("--")]
答案 4 :(得分:0)
我的情况与问题不同,但错误相同。
我的情况:
python命令在我的bash文件中与\
有一些换行符,例如
python args_config.py \
--arg1="hello" \
--arg2="world"
并引发python argparse: unrecognized arguments
args not found错误。
问题是Windows和Linux中bash文件的换行符不同,
仅通过pycharm File -> Line Separators -> LF - Unix and OS X (\n)
上传到linux并运行bash文件,就可以了!
答案 5 :(得分:0)
非常有用的线程。我和@Yan Zhu,@ unutbu和@FacePalm的回答几乎是相同的,但是我也需要接受argv。我想出了这一点,认为很不错,因为它允许我编写不需要sys.argv参数的单元测试。
import argparse, sys
def parse(arg_list):
p = argparse.ArgumentParser(description="my simple app")
p.add_argument('-z', '--zeta', type=str, default='[zeta from default]')
p.add_argument('-a', '--application', type=str, default='[application from default]')
return p.parse_known_args(arg_list)
code_args = [ '-a', 'a from code', '-q', 'q from code', '-o', 'o from code']
print(parse(code_args + sys.argv[1:]))
当您像这样-a 'a from intellij'
从intellij添加运行时参数时,结果看起来像这样。
/usr/local/bin/python3.7 /Users/me/IdeaProjects/co-util-py/test/varargstest.py -a "a from intellij"
(Namespace(application='a from intellij', other='o from code'), ['-q', 'q from code'])
您可以看到argparse不会删除q,但也不会解析它。
此外,经过大量的脑力劳动和测试,sys.argv和创建的列表之间的唯一真正区别是sys.argv[0]
是所调用程序的名称。从列表中删除它,没关系。