Python无法识别由PYTHONPATH设置的模块

时间:2016-11-18 18:23:57

标签: python

我已经搜索了一段时间来找到这个问题的解决方案但是已经干了。我希望我能在这里找到一些帮助。正如标题所示,python无法识别我PYTHONPATH中设置的模块。

我目前正在开发一个具有以下整体结构的项目:

base
├── util
│   └── logging_utility.py
└── project
    └── app
        ├── config.py
        └── runner.py

这是通过名为venv_1的虚拟环境在python 3.5中执行的。我使用的是运行El Capitan的Mac。

我的runner.py脚本使用以下import语句调用logging_utility

from util.logging_utility import method

执行时,我收到此错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'util.logging_utility'

我在终端从目录的base级别运行它。我使用以下命令调用脚本:

PYTHONPATH=$HOME/base VIRTUAL_ENV=$HOME/.virtualenvs/venv_1 PATH=$VIRTUAL_ENV/bin:$PATH $HOME/.virtualenvs/venv_1/bin/python -- project/app/runner.py

现在,我已经尝试通过打印env以及sys.path来调试此问题。在这两种情况下,base目录都会显示在路径中。那么为什么我收到这个错误?

我还尝试将导入语句更新为from base.util.logging_utility import method,这会给我以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'base'

知道为什么会发生这种情况以及我如何纠正这个问题?

谢谢!

更新

感谢BillyMoinuddin Quadri,他们的建议解决了这个问题。出于某种原因,我仍然需要添加__init__.py个文件。即使python 3.3+支持隐式导入,看起来仍然需要它。这解决了这个问题。

1 个答案:

答案 0 :(得分:2)

您可能无法在PYTHONPATH中找到打包路径。为了添加它,请执行:

 import sys
 sys.path.append('/absolute/path/to/base')

从Python 3.3起,您不需要__init__.py

对于旧版本,其他可能原因缺少__init__.py。如果目录中没有__init__.py文件,则无法导入该目录的文件。

正如Packages Document中提到的那样:

  

需要__init__.py个文件才能使Python将目录视为包含包;这样做是为了防止具有通用名称的目录(例如字符串)无意中隐藏稍后在模块搜索路径上发生的有效模块。在最简单的情况下,__init__.py可以只是一个空文件,但它也可以执行包的初始化代码或设置__all__变量,稍后将对此进行描述。