处理 argparse 冲突
Posted
技术标签:
【中文标题】处理 argparse 冲突【英文标题】:Handling argparse conflicts 【发布时间】:2016-06-30 16:45:57 【问题描述】:如果我导入一个已经在使用 argparse 的 Python module,但是,我想在我的脚本中也使用 argparse ...我应该怎么做这样做?
在使用以下代码并使用 -t 标志调用脚本时,我收到 无法识别的参数 错误:
片段:
#!/usr/bin/env python
....
import conflicting_module
import argparse
...
#################################
# Step 0: Configure settings... #
#################################
parser = argparse.ArgumentParser(description='Process command line options.')
parser.add_argument('--test', '-t')
错误:
unrecognized arguments: -t foobar
【问题讨论】:
请显示您传递给脚本的完整代码和完整命令行参数。您可能会发现这很有用:How to create a Minimal, Complete, and Verifiable example 【参考方案1】:你需要用
保护你的导入的模块if __name__ == '__main__':
...
反对它运行初始化代码,例如在导入时解析参数。见What does if __name__ == "__main__":
do?。
所以,在你的conflicting_module
做
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Process command line options in conflicting_module.py.')
parser.add_argument('--conflicting', '-c')
...
而不仅仅是全局创建解析器。
如果conflicting_module
中的解析是应用程序配置的强制部分,请考虑使用
args, rest = parser.parse_known_args()
在您的主模块中并将rest
传递给conflicting_module
,您可以将None
或rest
传递给parse_args
:
args = parser.parse_args(rest)
这仍然有点糟糕,实际上conflicting_module
中的类和函数理想情况下会从您的主模块接收解析的配置参数,而主模块将负责解析它们。
【讨论】:
看起来大部分代码都包含在构造函数中。即使我将第 39 行移到构造函数中,它仍然会产生相同的效果。 github.com/paulcalabro/api-kickstart/blob/master/examples/… 我猜你会使用EdgeGridConfig
。它仍然会添加这些参数,并在github.com/paulcalabro/api-kickstart/blob/master/examples/… 线上尝试解析它们并失败。
@PaulCalabro 换句话说:你对这个不走运。
好的,我可以解决这个问题。只是想知道是否有一种 Pythonic 方式来处理这种事情。谢谢!
@PaulCalabro 从__init__
中删除参数解析,使其成为一个单独的方法来调用。如果必须,请在使用 if __name__ == '__main__':
保护的模块中调用它。允许方法接收unknown arguments以上是关于处理 argparse 冲突的主要内容,如果未能解决你的问题,请参考以下文章
与两个连接的 python3 脚本一起使用时的 argparse 冲突