【问题标题】:ImportError: No module named - PythonImportError:没有命名模块 - Python
【发布时间】:2011-11-27 02:20:39
【问题描述】:

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

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

ma​​in 包中,我有一个名为 MyServer.py 的 python 模块,它具有如下导入语句:

from gen_py.lib import MyService

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

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

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

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

我在这里缺少什么?

【问题讨论】:

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

标签: python import


【解决方案1】:

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

【讨论】:

  • 我也有同样的问题。我使用 Windows、Eclipse。我们应该在 Eclipse 中做什么?
  • @Ceren 此代码应该适用于每个 IDE。您的 IDE(或者更准确地说,它的 Python 插件)可能实际上并未执行 Python 代码,在这种情况下,您可能需要在某处配置搜索路径。请随时 ask a new question 讨论此事。
  • @phihag 谢谢!一个小时前我问了一个问题,请随时回答=)stackoverflow.com/questions/17038416/…
  • 是否可以将它放在不在我的主应用程序中的某个地方?我使用这个解决方案来解决我的类似错误,但现在我有一个文件看起来很乱,到处都是导入。我认为在 init 文件中有一种方法可以做到这一点,但我找不到好的例子。
  • sys.path.append(os.path.join(os.path.dirname(__file__), '..')) 解析为什么?为什么不是sys.path.append(os.path.join('..', os.path.dirname(__file__)))
【解决方案2】:

要使 Python 模块导入工作,您的路径中必须有“src”,而不是“gen_py/lib”。

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

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

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

【讨论】:

  • 我不是这么说的。如果要导入“gen_py.lib”,则不要将 gen_py/lib 附加到路径中。您将文件夹 gen_py 附加在其中,在这种情况下可能是“..”。
【解决方案3】:
from ..gen_py.lib import MyService

from main.gen_py.lib import MyService

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

【讨论】:

    【解决方案4】:

    确保包含__init__.py,这会让 Python 知道这些目录包含包

    【讨论】:

      【解决方案5】:

      这是如果您正在构建一个包并且您在导入中发现错误。我很难学会。答案不是将包添加到python路径或以编程方式执行(如果您的模块被安装并且您的命令再次添加它怎么办?)那是一个坏方法。

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2019-12-12
          • 1970-01-01
          • 2016-01-16
          • 1970-01-01
          • 2017-06-13
          • 2014-10-03
          • 2013-01-23
          相关资源
          最近更新 更多