导入后Python模块为空

3 投票
2 回答
7144 浏览
提问于 2025-04-17 17:36

我注意到在尝试以不同方式导入一个叫做 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

撰写回答