python argparse:无法识别的参数

5ssjco0h  于 2023-09-29  发布在  Python
关注(0)|答案(6)|浏览(159)

当我运行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)
i7uq4tfw

i7uq4tfw1#

不要将sys.argv作为参数传递给parse_args。只是用

option = parser.parse_args()

如果将sys.argv传递给parse_args,则脚本本身的路径或名称是sys.argv中的第一项,因此成为option.filename的值。然后hehe变成未知参数。
如果省略sys.argv,则parse_args会按预期解析sys.argv

92dk7w1h

92dk7w1h2#

您可以通过允许未知参数来解决这个问题
取代

args = parser.parse_args()

args, unknown = parser.parse_known_args()
72qzrwbm

72qzrwbm3#

此外,作为对unutbu答案的补充,将参数存储在字典中的这种方式使测试变得容易:

args = vars(parser.parse_args())
print args

打印字典:

{'sort': ['bw'], 'filename': ['hehe']}

比如:

if args['sort'] == 'bw':
    # code here

...
0g0grzrc

0g0grzrc4#

我的情况和问题不一样,但错误是一样的。
我的情况:
1.我有一个远程开发(SFTP)与windows pycharm,并上传运行与Linux.
1.在我bash文件中,python命令有一些带有\的换行符,如

python args_config.py \
    --arg1="hello" \
    --arg2="world"

并引发python argparse: unrecognized arguments args not found错误。
问题是Bash文件换行在Windows和Linux中是不同的,
使用pycharm File -> Line Separators -> LF - Unix and OS X (\n)进行设置
上传到Linux并运行bash文件,它工作!

6pp0gazn

6pp0gazn5#

为了完成这个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("--")]
k5ifujac

k5ifujac6#

非常有用的线程。我的问题和@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:]))

当你从intellij中添加一个运行时参数时,像这样的-a 'a from 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]是被调用程序的名称。把它从列表中删除,这并不重要。

相关问题