2

我一直在为 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 变量的情况下解决这个问题。

4

2 回答 2

2

为了使import packagein module.py 成功,python 包package必须是可发现的。这意味着它必须在PYTHONPATH. 默认情况下,此路径包括(使用或site-packages放置 python 包的目录)。此外,PYTHONPATH 还包括当前工作目录。easy_installpip

如果您在 中.,则.放置在您的 PYTHONPATH 的开头。此目录不包含名为 的 python 包package,因此import package失败。

你可以./packages在启动 python 解释器之前移动到,也可以安装你的包。要执行后者,您需要一个 setup.py

于 2012-11-14T10:02:07.633 回答
1

当从 . 所有导入都必须相对于该目录。对于您的 module.py 文件,这意味着您必须这样做

import packages.package

代替

import package

这是因为 python 将使用 . 作为您在程序中执行的所有导入的基础。如果没有很多魔法,就不可能从父目录导入一些东西,所以你必须做一个绝对导入,如上所示。

于 2012-11-14T09:47:18.823 回答