argparse 错误:无法识别选项

Posted

技术标签:

【中文标题】argparse 错误:无法识别选项【英文标题】:argparse error: Option not recognized 【发布时间】:2014-06-26 11:21:13 【问题描述】:

我有一个关于 argparse 的问题。 这是我的代码的一部分:

(...)
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-g', '--gfirst', dest="a", type=int, required=True)
    args = parser.parse_args()
    print args.a #Testing
    print args.a #Testing

if __name__ == '__main__':
    main()
    print "3"
    unittest.main(verbosity=2)
    print "4"

(...)

我正在尝试将“a”设置为执行测试用例所需的值,因为我将来会需要这个值。不过……

$ python regular_test.py --gfirst 2
2
2
3
option --gfirst not recognized
Usage: regular-test.py [options] [test] [...]

Options:
  -h, --help       Show this message
  -v, --verbose    Verbose output
  -q, --quiet      Minimal output
  -f, --failfast   Stop on first failure
  -c, --catch      Catch control-C and display results
  -b, --buffer     Buffer stdout and stderr during test runs

...如您所见,程序接受参数并打印它,但测试用例本身不执行。我插入了一些打印件来显示正在执行的内容和未执行的内容。

我做错了什么? 提前致谢

ps.:我使用的是 python 2.7.3 ps2.:测试运行正常(在程序中添加 argparse 之前。)

【问题讨论】:

什么是unittest.main?它显然定义了一个与 regular_test.main 中的不同的参数解析器。 docs.python.org/2/library/unittest.html#basic-example 显示了调用 unittest.main() 的基本示例。我的代码骨架是这样的 然后在您未显示的regular_test.py 部分中的某处是一个测试函数,该函数定义了一个不同的参数解析器,该解析器无法识别--gfirst 参数,或者更确切地说unittest.main 为它自己的解析器也接受命令行参数,而不是--gfirst 【参考方案1】:

unittest.main() 本身 parses command-line arguments 并且它无法理解/识别您自定义定义的参数(请参阅 parseArgs() 类的 parseArgs() 方法)。

改为使用TextTestRunner 运行测试:

runner = unittest.TextTestRunner(verbosity=2)
result = runner.run(unittest.makeSuite(MyTestCase))

另见相关主题:

argparse and unittest python Call a python unittest from another script and export all the error messages

【讨论】:

这可能是问题所在。我没有用谷歌搜索 unittest,因为我认为问题与 argparse 有关。谢谢大家。 @Miller 是的,即使是docs 也在说:unittest.main() is a command-line program that loads a set of tests from module and runs them.【参考方案2】:

您的问题是单元测试人员想要拥有任何命令行参数。规定自己的论点可能会变得复杂。

从技术上讲,单元测试应该包含运行所需的一切,并且不应该依赖于参数。您可能会考虑将任何与环境相关的配置(例如数据库主机名)移动到环境变量中。

我的两分钱。

【讨论】:

以上是关于argparse 错误:无法识别选项的主要内容,如果未能解决你的问题,请参考以下文章

为啥直接调用 Python 脚本时 argparse 无法识别参数?

在 PyCharm 上导入 Kivy 时出现错误“[Core] 选项 --mode 无法识别”

将 postgresql 本地复制到远程数据库(都带有密码) - 错误:无法识别选项“区域设置”

Pip Requirements.txt --global-option 导致其他软件包安装错误。 “选项无法识别”

为啥 MSYS 无法识别 AM_INIT_AUTOMAKE 中的 tar-ustar 选项?

cc1:错误:在 mac 10.7.5 上安装 python-mysql 时无法识别命令行选项“-Wno-null-conversion”