Python包导入问题

时间:2012-11-14 09:38:34

标签: python python-import python-packaging

我一直在努力使用Python包导入。我搜索了网络,但未能找到合适的答案。

我有以下目录结构:

.
./__init__.py
./packages/
./packages/__init__.py
./packages/package
./packages/package/__init__.py
./packages/package/module.py

module.py源只包含一行:

import package

如果我转到“packages”目录,我可以导入包:

>>> 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变量的情况下解决此问题。

2 个答案:

答案 0 :(得分:2)

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

如果您在.,那么.将被放置在您的PYTHONPATH的开头。这个目录包含一个名为package的python包,因此import package失败。

您可以在启动python解释程序之前移至./packages,也可以安装程序包。要做后者,你需要一个setup.py

答案 1 :(得分:1)

从中运行程序时。所有导入必须相对于该目录。对于你的module.py文件,这意味着你必须做

import packages.package

而不是

import package

这是因为python会使用。作为您在程序中执行的所有导入的基础。如果没有太大的魔力,就无法从父目录导入内容,因此您必须进行绝对导入,如上所示。