这可能是一个愚蠢的问题,但我似乎无法弄明白。
考虑这个简单的场景:
# 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?)
答案 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.py
和b.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
执行类似操作。