处理 argparse 冲突

Handling argparse conflicts

如果我导入一个已经在使用 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

您需要使用

保护您的导入模块
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 中的函数理想情况下会从您的主模块接收解析的配置参数,该模块将负责解析它们。