使用点表示法进行Python导入并不像预期的那样工作

时间:2014-08-11 01:51:46

标签: python python-3.x python-3.3 importerror python-import

我最近在Python 3.3.2中安装了一个库。我试图从中导入一个模块:import cx_Freeze.freezer。但是,cx_Freeze.freezer没有像我预期的那样定义,如IDLE所示:

>>> ================================ RESTART ================================
>>> import cx_Freeze.freezer
>>> cx_Freeze.freezer
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    cx_Freeze.freezer
AttributeError: 'module' object has no attribute 'freezer'
>>> 

在命令行中发生同样的事情。我想我误解了使用点符号导入时会发生什么;模块分配给什么名称?

为了解决这个看似问题的问题,我在重新启动shell之后尝试了import cx_Freeze.freezer as f,但是它给出了与以前相同的错误。有人可以解释为什么这些导入语句不允许我访问该模块吗?

1 个答案:

答案 0 :(得分:5)

cx_Freeze/__init__.py具有以下内容:

version = "5.0"

import sys
from cx_Freeze.dist import *
if sys.platform == "win32":
    from cx_Freeze.windist import *
elif sys.platform == "darwin":
    from cx_Freeze.macdist import *
from cx_Freeze.finder import *
from cx_Freeze.freezer import *
from cx_Freeze.main import *

del dist
del finder
del freezer

对此问题非常重要的部分是from cx_Freeze.freezer import *del freezer。第一行将cx_Freeze.freezer.__all__中列出的所有内容直接导入cx_Freeze包,第二行使cx_Freeze.freezer无法直接导入。因此,您应该只使用cx_Freeze;它包含为外部使用而设计的cx_Freeze.freezer的所有部分。如果您需要cx_Freeze.freezer,也许可以使用某些私有功能,可以在sys.modules中找到它:

import sys
freezer = sys.modules['cx_Freeze.freezer']