处理argparse冲突

时间:2016-03-15 10:00:28

标签: python argparse

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

1 个答案:

答案 0 :(得分: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中的类和函数理想情况下会从主模块接收解析的配置参数,它将负责解析它们。