2011-09-28 88 views
58

我有以下目录结构的Python应用程序:导入错误:没有模块名为 - Python的

src 
| 
+---- main 
| 
+---- util 
| 
+---- gen_py 
     | 
     +---- lib 

在包主要,我有一个名为MyServer.py一个Python模块,它有一个进口声明一样:

from gen_py.lib import MyService 

为了让这种说法的工作,我把下面一行MyServer.py的开头:

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

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

ImportError: No module named gen_py.lib

我是缺少在这里?

+0

你用来运行MyServer.py的命令行是什么?你在什么目录? –

回答

69

您对sys.path的修改假设当前工作目录始终为main/。不是这种情况。相反,只需添加父目录sys.path

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模块。

+0

这有帮助,谢谢。 –

+0

我有同样的问题。我使用Windows,Eclipse。我们应该在Eclipse中做什么? – Ayse

+0

@Ceren此代码应该可以在每个IDE中使用。你的IDE(或者更确切的说Python插件)可能不会真正执行Python代码,在这种情况下,你可能需要在某处配置搜索路径。随意[问一个新的问题](http://stackoverflow.com/questions/ask)。 – phihag

6

为了让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

+0

我试过这个sys.path.append('../../ src/gen_py/lib'),但得到相同的错误... –

+0

这不是我说的。如果您要导入“gen_py.lib”,则不要将gen_py/lib附加到路径中。你追加文件夹gen_py在里面,在这种情况下可能是“..”。 – lunixbochs

5
from ..gen_py.lib import MyService 

from main.gen_py.lib import MyService 

请确保您有在每个目录(至少是空的)__init__.py文件。

3

确保包含__init__.py,这使得Python的知道,这些目录containpackages

3

这是如果你正在建设一个包,你是在寻找进口错误。我知道这是一个艰难的方式。答案并不是将程序包添加到python路径中,或者以编程方式执行(如果你的模块被安装并且你的命令再次添加它会怎么样?)这是一个坏方法。

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

相关问题