处理 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,您可以将Nonerest 传递给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 冲突

子命令中选项的 argparse 冲突解决程序将关键字参数转换为位置参数

argparse:多参数处理

Python 处理脚本的命令行参数:使用argparse

默认子命令,或不使用 argparse 处理子命令

使用 argparse 处理不确定的成对参数