导入后Python模块为空
我注意到在尝试以不同方式导入一个叫做 rmod2 的 Python 模块时,出现了一些看起来很奇怪的情况。如果我从 rmod2.py 文件所在的目录启动 Python,导入就没问题。但是,如果我把这个文件移动到另一个文件夹,那个文件夹里有其他模块,导入就不太正常了。
这个模块/包的文件夹是 /usr/lib/pymodules/python2.7,而且它也在 sys.path 里。所以我创建了一个文件夹 /usr/lib/pymodules/python2.7/rmod2,并在里面放了一个空的 __init__.py 文件和 rmod2.py 文件。如果没有 __init__.py 文件,我会得到:
>>> import rmod2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named rmod2
有了 __init__.py 文件后,导入似乎可以正常工作,但包是空的:
>>> import rmod2
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'rmod2']
>>> dir(rmod2)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
>>> rmod2.__path__
['/usr/lib/pymodules/python2.7/rmod2']
>>> rmod2.__file__
'/usr/lib/pymodules/python2.7/rmod2/__init__.py'
有人能告诉我这是怎么回事吗?还有怎么才能在导入时真正加载模块的内容呢?
2 个回答
1
有一次我遇到过一个情况,某个包里的模块在包内无法访问,但直接导入时却能正常工作。这可能是因为包的 __init__.py
文件里缺少了 __all__
的定义。
下面这个代码没有成功:
import mypkg obj = mypkg.mymodule.MyClass()而下面这个代码就成功了:
import mypkg.mymodule
obj = mypkg.mymodule.MyClass()
1
你想要把存放模块的文件夹路径加到你的 sys.path
变量中,或者直接把 rmod.py
模块放到路径中的一个文件夹里(而不是放在子文件夹里)。
通过在一个文件夹里添加 __init__.py
文件,你就把这个文件夹变成了一个 Python 包,这样就可以被导入了。如果这是你想要的,那么你就把 rmod
模块放进了一个 rmod
包里,你可以通过这个命名空间来导入它:
from rmod2 import rmod2