Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python argparse的范围是什么_Python_Scope_Argparse - Fatal编程技术网

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解析器定义的参数,请考虑导入它,并将其作为父级传递给分析器。