4

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

考虑这个简单的场景:

# 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

[提示]# python a.py --help

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

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

我不明白的是 a.py 怎么会接受参数 'b' 而不是 'a' 换一种说法,我如何只导入一个变量而不是整个文件?'from b import foo' 不应该处理它吗?

编辑: 我已经发布了另一个关于相同问题的问题,因为我仍然不知道如何解决我的问题(有没有办法清除 python argparse?

4

2 回答 2

3

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

import b
foo = b.foo
del b

尽管它确实“仅导入foo”,但它仍然在顶层运行所有语句b.py(无论如何这都是foo有用的),包括对parse.parse_args(). 此调用将打印帮助文本并完全忽略argparse调用,a.py因为这些调用尚未发生。

如果您希望您的模块能够添加参数,则需要将 的创建与ArgumentParserparse_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
于 2013-09-17T12:42:58.810 回答
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.

于 2013-09-17T12:48:03.677 回答