我有一个顶级脚本(在顶级目录中)导入自定义模块'reporting'(在子目录中)
当脚本从使用re.match的模块调用函数时遇到导入问题,当我启动它时出现错误:
111 if sys.argv[i] in valid_options:
112 current_option_type = valid_options[sys.argv[i]];
--> 113 if (re.match(r'\barg\b',current_option_type)):
'NameError:名称're'未定义'`
的确,当我检查我导入的模块时,我最终得到了
In [12]: set(sys.modules)&set(globals())
Out[12]: {'datetime', 'os', 'sys'}
为了使它工作,我决定导入另一个模块,它本身导入re(并且位于子目录中):
import ip_interface
我调用我的函数并最终得到同样的错误,当我检查时,我有:
In [14]: set(sys.modules)&set(globals())
Out[14]: {'datetime', 'ip_interface', 'os', 'sys'}
所以我改变了导入ip_interface模块的方法并执行:
from ip_interface.ip_interface import *
我检查我导入的模块:
In [16]: set(sys.modules)&set(globals())
Out[16]:
{'datetime',
'ip_interface',
'knxnet',
'os',
're', ===> I got it !
'socket',
'subprocess',
'sys'}
然后我启动我的脚本并最终得到:
111 if sys.argv[i] in valid_options:
112 current_option_type = valid_options[sys.argv[i]];
--> 113 if (re.match(r'\barg\b',current_option_type)):
NameError:未定义名称're'
我想知道出了什么问题,因为我可以看到're'模块是导入的。
当我直接在我的模块中导入它时,它终于有效了。 是否有可能“共享”导入并避免在需要它的所有子模块中进行操作?
答案 0 :(得分:1)
要避免这种NameError
,您必须在主模块中执行import re
,否则将无法知道名称re
。在导入的模块中执行import re
是不够的,因为这是一个不同的命名空间。
它出现在sys.modules
中的事实只意味着它已被导入某处。但要在模块的命名空间中查看它,您需要在该模块中执行import re
。