【问题标题】:import error: 'No module named' *does* exist导入错误:“没有命名模块”*确实存在
【发布时间】:2014-06-18 12:51:47
【问题描述】:

当我启动金字塔 pserve 时,我得到了这个堆栈跟踪:

% python $(which pserve) ../etc/development.ini
Traceback (most recent call last):
  File "/home/hughdbrown/.local/bin/pserve", line 9, in <module>
    load_entry_point('pyramid==1.5', 'console_scripts', 'pserve')()
  File "/home/hughdbrown/.virtualenvs/ponder/local/lib/python2.7/site-packages/pyramid-1.5-py2.7.egg/pyramid/scripts/pserve.py", line 51, in main
    return command.run()
  File "/home/hughdbrown/.virtualenvs/ponder/local/lib/python2.7/site-packages/pyramid-1.5-py2.7.egg/pyramid/scripts/pserve.py", line 316, in run
    global_conf=vars)
  File "/home/hughdbrown/.virtualenvs/ponder/local/lib/python2.7/site-packages/pyramid-1.5-py2.7.egg/pyramid/scripts/pserve.py", line 340, in loadapp
    return loadapp(app_spec, name=name, relative_to=relative_to, **kw)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 247, in loadapp
    return loadobj(APP, uri, name=name, **kw)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 271, in loadobj
    global_conf=global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 296, in loadcontext
    global_conf=global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 320, in _loadconfig
    return loader.get_context(object_type, name, global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 454, in get_context
    section)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 476, in _context_from_use
    object_type, name=use, global_conf=global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 406, in get_context
    global_conf=global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 296, in loadcontext
    global_conf=global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 337, in _loadfunc
    return loader.get_context(object_type, name, global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 681, in get_context
    obj = lookup_object(self.spec)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/util.py", line 68, in lookup_object
    module = __import__(parts)
  File "/home/hughdbrown/.virtualenvs/ponder/local/lib/python2.7/site-packages/ponder-0.0.40-py2.7.egg/ponder/server/__init__.py", line 10, in <module>
    from ponder.server.views import Endpoints, route
ImportError: No module named views

这在 python REPL 中可以正常工作:

% python
Python 2.7.5+ (default, Feb 27 2014, 19:37:08) 
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from ponder.server.views import Endpoints, route
>>> 

并从命令行导入:

% python -c "from ponder.server.views import Endpoints, route"

删节的tree 输出显示了我正在使用的内容:

% tree
├── __init__.py
├── ponder
│   ├── __init__.py
│   ├── server
│   │   ├── __init__.py
│   │   └── views
│   │       ├── environment_templates.py
│   │       ├── groups.py
│   │       ├── __init__.py
│   │       ├── instances.py
│   │       ├── tasks.py
│   │       └── users.py

我的PYTHONPATH 设置为这棵树的根:

% echo $PYTHONPATH
/home/hughdbrown/workspace/ept/ponder/lib

我在使用 python 2.7 的 virtualenv 中运行它。我今天一直在工作,但我不知道问题出在哪里。一方面,__init__.py 似乎可以与之前的 some 导入:

from .database import get_db
from .config import parser
from .views import Endpoints, route

(我将最后一行更改为绝对导入。没有运气。)

我尝试过的事情:

  1. 重建虚拟环境

  2. 设置PYTHONPATH

  3. 在代码中使用绝对路径

  4. Looking for circular imports

我愿意接受有关如何调试此错误的进一步建议。


所以我犯的错误是只查看源代码树。问题实际上出在运行时环境中,在我的 virtualenv 中。当我查看那里时,我发现没有安装所需的文件。问题的根源在于setup.py

【问题讨论】:

  • 这不是重复的,至少因为您提供的链接没有重复这个问题。在那里,问题是其中之一: - Windows scp 和 linux 的一些怪异; - 不正确地设置 PYTHONPATH; - 未能始终使用 __init__.py。这些都不是这里的问题。在我的情况下,setup.py 没有递归复制文件,因此在 dev-env 中存在的 virtualenv 中缺少导入。修复是添加到MANIFEST.in,我相信。所以,明显不同,而不是重复。
  • @EdChum,这不是重复的。它具有相同的错误消息,但原因不同,解决方案与您引用的重复项非常不同。你能重新考虑一下吗?我还没有找到通过 stackoverflow、电子邮件或 twitter 与您联系的方式。
  • 抱歉,我重新打开了这篇文章,看起来还是一样,但您可以随时使用@whatever 向任何关闭问题的人发送消息
  • 好问题。为答案感到羞耻。

标签: python python-import


【解决方案1】:

我将PYTHONPATH 设置为'.' 并为我解决了这个问题。

export PYTHONPATH='.'

对于单线,您可以轻松做到:

PYTHONPATH='.' your_python_script

这些命令应该在终端中运行

【讨论】:

  • 这在 TravisCI 中也为我解决了这个问题——你会认为这不是必需的。谢谢!
  • 我们需要在哪里执行这个?
  • @ParthapratimNeog 导出应在执行脚本之前在终端窗口中运行。如果您不想添加环境变量,我还使用单行解决方案扩展了我的答案。
  • 我认为添加绝对路径比添加. 更好,因为如果您更改目录,. 将不会跟随。
【解决方案2】:

我通常的技巧是在发生导入问题的实际上下文中简单地打印sys.path 。在您的情况下,打印的位置似乎在 /home/hughdbrown/.local/bin/pserve 。然后检查路径显示的地方的目录和文件..

你首先要做到这一点:

import sys

在带有打印功能的python 3中:

print(sys.path)

或在 python 2 中使用打印表达式:

print sys.path

【讨论】:

  • 好的,所以问题是在我的 virtualenv 中,该路径 not 存在。当我tree我的 virtualenv 时,我可以看到缺少 views 目录。这个问题 starts 在 setup.py 我正在使用它命名要安装在包部分中的目录,但不会遍历目录。好的,我正在解决这个问题。首先,我需要一个更好的 setup.py。
  • 如何打印sys.path
  • 在 python2 中使用打印表达式:print sys.path,在 python3 中使用打印函数:print(sys.path)。在这之前你需要import sys
  • 我解决了在我的项目的 settings.py 中添加这个:`` import sys sys.path.insert(1, '{project_path}') `` Ty @M-T-A
【解决方案3】:

我遇到了同样的问题,我通过在python文件的顶部添加以下代码来解决它:

import sys
import os

sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))

os.path.dirname 的重复次数取决于文件在您的项目层次结构中的位置。例如,在我的情况下,项目根目录是向上三层。

【讨论】:

    【解决方案4】:

    PYTHONPATH 设置不正确。使用export PYTHONPATH=$PYTHONPATH:/path/to/your/modules 导出它。

    【讨论】:

      【解决方案5】:

      我遇到了同样的问题,我在错误行之前尝试了 pdb.set_trace()。

      我的问题是包名与模块名重复,例如:

      test
      ├── __init__.py
      ├── a
      │   ├── __init__.py
      │   └── test.py
      └── b
          └── __init__.py
      

      在文件a/__init__.py 中,使用from test.b import xxx 将导致ImportError: No module named b

      【讨论】:

        【解决方案6】:

        它们是运行python脚本的几种方式:

        • 双击file.py运行(打开python命令行)
        • 从 cmd 提示符 (cmd) 运行您的 file.py(拖放 例如你的文件)
        • 在 IDE 中运行 file.py(例如 pyscripter 或 Pycharm)

        这些方式中的每一种都可以运行不同版本的 python (¤)


        查看cmd运行的是哪个python版本: 输入cmd:

        python --version 
        

        点击.py时检查运行的是哪个python版本:

        选项 1

        创建一个包含以下内容的 test.py:

        import sys print (sys.version)
        input("exit")
        

        选项 2

        输入命令:

        assoc .py
        ftype Python.File
        

        检查路径,是否在 cmd 中识别模块(例如:win32clipboard):

        创建一个包含以下内容的 test.py:

        python
        import sys
        sys.executable
        sys.path
        import win32clipboard
        win32clipboard.__file__
        

        检查路径以及 .py 中是否可以识别模块

        创建一个包含以下内容的 test.py:

        import sys
        print(sys.executable)
        print(sys.path)
        import win32clipboard
        print(win32clipboard.__file__)
        

        如果 cmd 中的版本正常,但 .py 中的版本没有问题,那是因为与 .py 关联的默认程序不是正确的。更改 .py 的 python 版本

        更改与 cmd 关联的 python 版本:

        Control Panel\All Control Panel Items\System\Advanced system setting\Environnement variable 在 SYSTEM 变量中将path 变量设置为您的python 版本(路径由; 分隔:cmd 使用第一个路径,例如:C:\path\to\Python27;C:\path\to\Python35 → cmd 将使用python27)

        更改与 .py 扩展名关联的 python 版本:

        以管理员身份运行 cmd:

        写:ftype Python.File="C:\Python35\python.exe" "%1" %* 它将设置最后一个python版本(例如python3.6)。如果您的最后一个版本是 3.6,但您想要 3.5,只需在您的文件夹中添加一些 xxx (xxxpython36),这样它将采用最后一个识别的版本,即 python3.5(在 cmd 删除 xxx 之后)。

        其他:

        “没有模数错误”也可能来自 python et 3 的语法错误(例如,打印函数缺少括号...)

        ¤ 因此他们每个人都有自己的 pip 版本

        【讨论】:

        • 哦,我不能强调检查python --version 的重要性。意外运行 Python 2.7 太容易了,特别是如果您在具有不同虚拟机的多台不同计算机上进行开发:) 显然,当您的项目使用 Python 3 并且系统使用 Python 2.7 时,运行 python3 &lt;spam&gt; 而不是 python &lt;spam&gt; python 别名。
        【解决方案7】:

        我有同样的问题。我通过在不同的 python 版本中运行命令来解决它。我试过python3 filename.py。之前我使用的是 Python 2.7。

        另一种可能性是导入某些内容的文件可能包含 BOM(字节顺序标记)。可以通过在一些支持多种编码(如 VSCode(Notepad++))的编辑器中打开文件并保存为不同的编码标准(如 ANSI、UTF-8(无 BOM))来解决此问题。

        【讨论】:

          【解决方案8】:

          如果您在另一个目录中有一个与您的模块同名的脚本,它将使用该脚本。例如:

          module.py
          
          module
          |
          |--module
          |  |
          |  |--__init__.py
          |  |--module.py
          

          这将使第一个 module.py 被使用,而不是第二个。

          【讨论】:

            【解决方案9】:

            如果有人对此感兴趣,我在 Cygwin 中运行 Python 时遇到了同样的问题,在我的情况下,它抱怨即使安装了 pandas 也没有安装。问题是我安装了 2 个 python - 一个在 windows 中,另一个在 cygwin 中(使用 cygwin 安装程序),虽然两者都是相同版本的 Python,但 Cygwin 安装对 Pandas 的安装位置感到困惑。当我卸载 cygwin 的 Python 并将 Cygwin 指向 Windows 安装时,一切都很好

            【讨论】:

              【解决方案10】:

              我也遇到过这个问题,我只是忘记在执行我的程序之前在终端中输入 workon myproject。

              【讨论】:

                【解决方案11】:

                当我没有正确输入内容时,我得到了这个。我有

                __init.py__ 
                

                而不是

                __init__.py
                

                【讨论】:

                  猜你喜欢
                  • 2017-04-07
                  • 2020-09-14
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-05-07
                  • 2020-10-26
                  • 1970-01-01
                  • 2011-02-17
                  • 1970-01-01
                  相关资源
                  最近更新 更多