由自定义模块

时间:2017-07-31 14:52:18

标签: python import module

我有一个顶级脚本(在顶级目录中)导入自定义模块'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'模块是导入的。

当我直接在我的模块中导入它时,它终于有效了。 是否有可能“共享”导入并避免在需要它的所有子模块中进行操作?

1 个答案:

答案 0 :(得分:1)

要避免这种NameError,您必须在主模块中执行import re,否则将无法知道名称re。在导入的模块中执行import re是不够的,因为这是一个不同的命名空间。

它出现在sys.modules中的事实只意味着它已被导入某处。但要在模块的命名空间中查看它,您需要在该模块中执行import re