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

Python does not recognize a module which is set by PYTHONPATH

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

我目前正在从事一个总体结构如下的项目:

1
2
3
4
5
6
7
base
├── util
│   └── logging_utility.py
└── project
    └── app
        ├── config.py
        └── runner.py

这是在python 3.5中通过名为venv_1的虚拟环境执行的。我用的是苹果电脑运行的ElCapitan。

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

from util.logging_utility import method

执行时,我收到此错误:

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

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

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

现在,我试着通过打印我的envsys.path来调试它。在这两种情况下,base目录都出现在路径中。那么,我到底为什么会收到这个错误呢?

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

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

知道为什么会发生这种情况吗?我该如何纠正?

谢谢!

更新

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


您可能没有在PYTHONPATH中打包的路径。为了补充这一点,请执行以下操作:

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

因为从python 3.3开始,您不需要__init__.py

对于旧版本,另一个可能的原因是缺少__init__.py。如果目录中没有__init__.py文件,则不能导入该目录的文件。

如文件包中所述:

The __init__.py files are required to make Python treat the directories as containing packages; this is done to prevent directories with a common name, such as string, from unintentionally hiding valid modules that occur later on the module search path. In the simplest case, __init__.py can just be an empty file, but it can also execute initialization code for the package or set the __all__ variable, described later.