python argparse的范围是什么

时间:2013-09-17 12:39:36

标签: python scope argparse

这可能是一个愚蠢的问题,但我似乎无法弄明白。

考虑这个简单的场景:

# file a.py
from b import foo
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-a')
args = parser.parse_args()

# file b.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-b')
args = parser.parse_args()

foo = 1

[prompt] #python a.py --help

  

用法:a.py [-h] [-b B]

     

可选参数:-h, - help显示此帮助消息并退出-b   乙

我不明白的是a.py如何接受参数'b'而不是'a' 另外,如何仅导入变量而不导入整个文件?不应该'从b导入foo'处理它吗?

修改 我发布了另一个关于同一问题的问题,因为我仍然不知道如何解决我的问题(is there a way to clear python argparse?

2 个答案:

答案 0 :(得分:3)

from b import foo大致相当于以下内容:

import b
foo = b.foo
del b

虽然它“仅导入foo”,但它仍会运行b.py顶级的所有语句(这对于foo来说无论如何都是必要的),包括致电parse.parse_args()。此调用将打印帮助文本,并完全忽略argparse中的a.py来电,因为这些调用尚未发生。

如果您希望模块能够添加参数,则需要将ArgumentParser的创建与对parse_args的调用分开。例如,您可以拥有单独的args模块:

# file args.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--common')
...

它将同时用于a.pyb.py

# file a.py
from b import foo
import args
args.parser.add_argument('-a')

# only actually parse args if we are invoked as main script; mere `import a`
# shouldn't run the parser
if __name__ == '__main__':
    args = parser.parse_args()
    ...

# file b.py
import args
args.parser.add_argument('-b')

foo = 1

答案 1 :(得分:1)

如果您在__main__命名空间中,则应该只解析命令行参数。要防止b.py解析参数,请将其更改为以下内容:

# file b.py

foo = 1

if __name__ == '__main__':
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('-b')
    args = parser.parse_args()

您应该对a.py执行类似操作。