关于import:ImportError:没有名为的模块 – Python

ImportError: No module named - Python

我有一个具有以下目录结构的python应用程序:

1
2
3
4
5
6
7
8
9
src
 |
 +---- main
 |
 +---- util
 |
 +---- gen_py
         |
         +---- lib

在package main中,我有一个名为myserver.py的python模块,它有一个import语句,如下所示:

1
from gen_py.lib import MyService

为了使该语句正常工作,我在myserver.py的开头放了以下行:

1
2
import sys
sys.path.append('../gen_py/lib')

当我在终端中运行myserver.py时,我得到以下错误:

ImportError: No module named gen_py.lib

我这里缺少什么?


您对sys.path的修改假定当前工作目录始终位于main/中。事实并非如此。相反,只需将父目录添加到sys.path

1
2
3
4
5
import sys
import os.path

sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
import gen_py.lib

不要忘记在gen-py和lib中包含一个文件__init__.py——否则,它们将不会被识别为python模块。


要使python模块导入工作,路径中必须有"src",而不是"gen-py/lib"。

在处理像import gen_py.lib这样的导入时,它查找一个模块gen_py,然后查找一个子模块lib

由于模块gen_py将不在"..gen-py/lib"中(它将在".."),因此添加的路径对导入过程没有任何帮助。

根据运行路径的不同,尝试将相对路径添加到"src"文件夹。可能是sys.path.append('..')。当您直接在src文件夹中,通过类似python main/MyServer.py的相对路径,也可以成功地运行脚本。


1
from ..gen_py.lib import MyService

1
from main.gen_py.lib import MyService

确保每个目录上都有一个(至少为空)__init__.py文件。


这是如果您正在构建一个包,并且在导入中发现错误。我很难理解这一点。答案不是将包添加到python路径中,或者通过编程来完成(如果您的模块被安装了,而您的命令又添加了它,会怎么样?)那是个坏办法。

正确的做法是:1)使用virtualenv pyvenv-3.4或类似的工具2)激活开发模式-$python setup.py develop


确保包含__init__.py,这使python知道这些目录包含包


确保在sys.path输出中是否出现根项目目录。否则,请将根项目目录的路径添加到sys.path。