ImportError:未命名模块-Python


68

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

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

在包main中,我有一个名为MyServer.py的python模块,它具有如下的import语句:

from gen_py.lib import MyService

为了使该语句起作用,我将以下行放在MyServer.py的开头:

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

在终端中运行MyServer.py时,出现以下错误:

ImportError:没有名为gen_py.lib的模块

我在这里想念的是什么?


您用来运行MyServer.py的命令行是什么?您在哪个目录中?
Mark Hildreth

Answers:


80

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

import sys
import os.path

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

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


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

@Ceren此代码应在每个IDE中都有效。您的IDE(或更准确地说,是它的Python插件)可能实际上没有执行Python代码,在这种情况下,您可能需要在某处配置搜索路径。随便问一个新问题
phihag 2013年

@phihag谢谢!我问过一个小时前的问题,请随时来回答=) stackoverflow.com/questions/17038416/...
艾谢·

是否可以将其放在我的主应用程序中以外的地方?我使用此解决方案解决了类似的错误,但是现在我的文件看起来到处都是乱七八糟的。我以为在init文件中可以做到这一点,但是我找不到很好的例子。
MarkII

什么sys.path.append(os.path.join(os.path.dirname(__file__), '..')) 决心?为什么不呢sys.path.append(os.path.join('..', os.path.dirname(__file__)))
Alex

6

为了使Python模块导入正常进行,您的路径中必须有“ src”,而不是“ gen_py / lib”。

在处理类似导入的操作时import gen_py.lib,它将查找模块gen_py,然后查找子模块lib

由于模块gen_py不会位于“ ../gen_py/lib”中(它将位于“ ..”中),因此添加的路径将无助于导入过程。

根据运行它的位置,尝试将相对路径添加到“ src”文件夹。也许是sys.path.append('..')。您可能还可以通过以下相对路径直接在src文件夹中直接在src文件夹中运行脚本python main/MyServer.py


我不是那个意思 如果要导入“ gen_py.lib”,则不要将gen_py / lib附加到路径中。您将文件夹gen_py附加在其中,在这种情况下可能是“ ..”。
lunixbochs 2011年

5
from ..gen_py.lib import MyService

要么

from main.gen_py.lib import MyService

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


3

确保包括在内__init__.py,这使Python知道这些目录包含软件包


3

这是在构建程序包时发现导入错误。我是很难学的。答案不是将软件包添加到python路径或以编程方式进行(如果安装了模块并且您的命令再次添加了该包呢?)那是一种不好的方法。

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


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.