python argparse的范围是什么
这可能是个愚蠢的问题,但我似乎无法理解 考虑以下简单场景:python argparse的范围是什么,python,scope,argparse,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('-
# 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--帮助
用法:a.py[-h][-b]
可选参数:-h,--help显示此帮助消息并退出-b
B
我不明白的是为什么a.py接受参数“b”而不是“a”
另一方面,如何只导入一个变量而不导入整个文件?“从b进口食品”不应该处理它吗
编辑:
由于我仍然不知道如何解决我的问题,因此我发布了另一个与同一问题相关的问题()
来自b import foo
大致相当于以下内容:
import b
foo = b.foo
del b
# file b.py
foo = 1
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-b')
args = parser.parse_args()
尽管它“只导入foo
”,但它仍然在b.py
的顶层运行所有语句(这是foo
仍然有用所必需的),包括调用parse.parse_args()
。此调用将打印帮助文本并完全忽略a.py
中的argparse
调用,因为这些调用尚未发生
如果希望模块能够添加参数,则需要将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
只有在
\uuuu main\uuuu
命名空间中,才应该分析命令行参数。要防止b.py
解析参数,请将其更改为以下内容:
import b
foo = b.foo
del b
# file b.py
foo = 1
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-b')
args = parser.parse_args()
对于
a.py
你也应该这样做,谢谢你快速而深刻的回答。假设我必须在b.py中处理参数,而b.py不是主文件,有什么方法可以解决它吗?@Ofir在这种情况下,我会在b.py
中定义一个函数来接受参数并处理它们,我仍然不确定如何解决这个问题,因为我的b.py文件依赖于其中的一些参数,但您确实回答了我最初的问题。10x@Ofir依赖于这些参数的b.py
部分应该在从主模块调用的函数(或该函数调用的函数等)中。如果a
和b
都需要独立地向参数解析器添加参数,则这将不起作用。请注意,在OP的代码a.py
中添加了-a
和b.py
添加了-b
,OP希望生成的脚本同时接受这两个选项。这不是问题的一部分,但您仍然可以这样做。在这种情况下,您应该只在\uuuuu main\uuuuu
中创建ArgumentParser
对象,但仍然在每个文件的全局范围中添加参数。导入b时不希望运行的任何内容都需要进入if\uuuu name\uuuuu
块。虽然您可能希望在b中定义解析器,但可能不希望运行parse_args。在这种情况下,b parse_args遇到了-h
,并发出了sys.exit
。未产生错误的输入将由两个解析器解析。但是,如果您想使用由B解析器定义的参数,请考虑导入它,并将其作为父级传递给分析器。