我在argparse
文件中使用main.py
解析了参数。我在global_vars.py
文件中定义了一些变量,此文件包含在main.py
和其他文件中。
我正在为全局变量分配已解析的参数,但是当我尝试跨main.py
以外的文件访问这些全局变量时,它返回None
。有什么我缺少的,或者它是argparse
的命名空间问题?
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Accept arguments')
parser.add_argument('-n', help='enter period for which you want to do the sampling')
parser.add_argument('-b', help='enter directory for bhav copy')
parser.add_argument('-d', help='enter directory for deliverables')
parser.add_argument('-l', help='enter list type')
args = parser.parse_args(namespace=None)
var_dict = vars(args)
bhavcopy_dir=var_dict['b']
deli_dir=var_dict['d']
no_of_sessions=var_dict['n']
list_type=var_dict['l']
答案 0 :(得分:0)
请注意,您放在if __name__ == "__main__":
中的任何代码只有在您直接运行python文件时才会运行。因此,如果该代码被假定为您的global_var.py,并且您只是导入global_var,那么该代码不会运行,并且您的变量永远不会被初始化。放入一些打印语句来验证是否/何时实际创建了变量。
答案 1 :(得分:0)
argparse
不是唯一拥有命名空间的东西。每个模块(文件)和功能都有一个。 argparse
只返回类argparse.Namespace
的对象,可以将其视为模块的命名空间。也就是说,您使用args.name
语法访问该对象中的项目。
完成
之后的事情bhavcopy_dir = args.b
bhavcopy_dir
是main
命名空间中的参数。您可以在main
的其他位置通过该名称访问它。但是,如果导入main
,则访问权限会更改。
我们需要查看更多main.py
。我怀疑它包括
import argparse
import global_vars
# or is it
# from global_vars import *
if __name__ == '__main__':
parser = argparse.ArgumentParser()
....
args = ...
var1 = args.var1
使用import global_vars
,您可以使用global_vars.var1
访问在那里定义的变量。通过*
导入,var1
加载到全局(主)命名空间。
import argparse
加载argparse
命名空间。 argparse.ArgumentParser
正在访问该模块中的对象(类)。
我是否还需要解释if __name__...
块如何更改输入?
您的问题是关于模块,命名空间和导入,而不是argparse
。
正如评论中所建议的那样,只需传递args
变量并根据需要访问其属性通常很方便。
也许这对文件会说明问题(没有argparse)
main1.py
档案:
import sub1
print(sub1.var1)
var_from_main = 123
sub1.foo(var_from_main)
sub1.test()
sub1.py
档案:
var1 = 345
def test():
print(var_from_main)
def foo(var):
print(var)
if __name__ == '__main__':
var1 = 'sub __main__ setting'
可以从var1
(使用正确的名称)访问sub1
中定义的 main1
,但导入不会使用__name__
块中设置的值。
main1
中设置的变量在导入的模块中无法访问。
1021:~/mypy$ python3 main1.py
345
123
Traceback (most recent call last):
File "main1.py", line 5, in <module>
sub1.test()
File "/home/paul/mypy/sub1.py", line 3, in test
print(var_from_main)
NameError: name 'var_from_main' is not defined