argparse解析的参数在其他文件中不可访问

时间:2016-06-25 14:53:49

标签: python argparse

我在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']

2 个答案:

答案 0 :(得分:0)

请注意,您放在if __name__ == "__main__":中的任何代码只有在您直接运行python文件时才会运行。因此,如果该代码被假定为您的global_var.py,并且您只是导入global_var,那么该代码不会运行,并且您的变量永远不会被初始化。放入一些打印语句来验证是否/何时实际创建了变量。

答案 1 :(得分:0)

argparse不是唯一拥有命名空间的东西。每个模块(文件)和功能都有一个。 argparse只返回类argparse.Namespace的对象,可以将其视为模块的命名空间。也就是说,您使用args.name语法访问该对象中的项目。

完成

之后的事情
bhavcopy_dir = args.b

bhavcopy_dirmain命名空间中的参数。您可以在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