Python 导入模块时的奇怪行为

Python 导入模块时的奇怪行为,python,python-import,Python,Python Import,我有一个名为“package”的Python包。其中有空的\uuuu init\uuuu.py和两个模块。其中一个名为m1.py,只包含一行: x = 3 另一个称为m2.py,包含以下行: x = 5 现在我试着使用这个模块。首先,我会这样做: from package.m1 import x print package.m1.x from package.m1 import x import package.m2 print package.m1.x 当然它不起作用-我得到这样的错误

我有一个名为“package”的Python包。其中有空的
\uuuu init\uuuu.py
和两个模块。其中一个名为
m1.py
,只包含一行:

x = 3
另一个称为
m2.py
,包含以下行:

x = 5
现在我试着使用这个模块。首先,我会这样做:

from package.m1 import x
print package.m1.x
from package.m1 import x
import package.m2
print package.m1.x
当然它不起作用-我得到这样的错误:

NameError: name 'package' is not defined
我理解为什么它不起作用。但后来我做了类似的事情:

from package.m1 import x
print package.m1.x
from package.m1 import x
import package.m2
print package.m1.x

现在它确实起作用了。为什么?怎么用?我没有导入package.m1

从x导入y的
语法导入整个模块,然后在当前名称空间中引用指定的对象。它可以翻译为:

import x
y = x.y

所以,您实际上是在导入package.m1。对此,我只有一个解释:

  • 从package.m1导入x
    加载模块
    package
    package.m1
    <代码>m1
  • 已添加到
    程序包
    模块中,但
    程序包
    未添加到全局
  • import package.m2
    现在将
    package
    模块添加到您的globals中。由于
    m1
    已经是
    package
    的一部分,现在可以通过
    package.m1
    访问它
  • 进一步测试:

    >>> from package import m1
    >>> package.m1
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'package' is not defined
    >>> import package.m2
    >>> package.m1
    <module 'package.m1' from 'package/m1.py'>
    >>> from package import m3
    >>> package.m3
    <module 'package.m3' from 'package/m3.py'>
    
    来自程序包导入m1的
    >>
    >>>包1.m1
    回溯(最近一次呼叫最后一次):
    文件“”,第1行,在
    NameError:未定义名称“包”
    >>>进口包装1.m2
    >>>包1.m1
    >>>从包装进口m3
    >>>1.3包
    
    继续测试:

    >>> import package.m1
    >>> del package
    >>> import package
    >>> package.m1
    <module 'package.m1' from 'package/m1.py'>
    
    >import package.m1
    >>>del包
    >>>进口包装
    >>>包1.m1
    
    完全错误,导入包不会自动导入所有模块。事实确实如此。检查很简单:
    importsys;在第一条
    import
    语句之后打印系统模块['package']