我一直在为Python包导入而苦苦挣扎。我在网上搜索,但找不到合适的答案。
我有以下目录结构:
.
./__init__.py
./packages/
./packages/__init__.py
./packages/package
./packages/package/__init__.py
./packages/package/module.py
module.py 源仅包含一行:
import package
如果我转到"包"目录,我可以导入包:
>>> import python
>>>
如果我转到"."目录,我想按如下方式导入模块(或包):
>>> import packages.package.module as module
但是我收到错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "vendor/package/module.py", line 1, in <module>
import package
ImportError: No module named package
我需要在__init__.py文件中放入什么,以便我可以执行上述导入?更多,我需要在 ./__init__.py 文件中放入什么,以便我能够从 ../目录?
如果可能的话,我想在不更改 sys.path 变量的情况下解决这个问题。
为了使 module.py 中的import package
成功,python包package
必须是可发现的。这意味着它必须在 PYTHONPATH
.默认情况下,此路径包括 site-packages
(将 python 包与 easy_install
或 pip
一起放置的目录)。此外,PYTHONPATH 还包括当前工作目录。
如果你在 .
中,那么.
被放置在 PYTHONPATH 的开头。此目录不包含名为 package
的 python 包,因此import package
失败。
您可以在启动 python 解释器之前移动到 ./packages
,也可以安装您的软件包。要执行后者,您需要一个 setup.py
从 运行程序时。 所有导入都必须相对于该目录。对于您的 module.py 文件,这意味着您必须这样做
import packages.package
而不是
import package
这是因为 python 将使用 . 作为您在程序中执行的所有导入的基础。如果没有很多魔法,就不可能从父目录中导入某些内容,因此您必须执行绝对导入,如上所示。