关于python:import error:’没有名为’*的模块*存在

import error: 'No module named' *does* exist

当我启动金字塔pserver时,我正在获取此堆栈跟踪:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
% 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可以很好地工作:

1
2
3
4
5
6
% 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
>>>

从命令行导入:

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

简略的tree输出显示了我的工作内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
% tree
├── __init__.py
├── ponder
│&nbsp;&nbsp; ├── __init__.py
│&nbsp;&nbsp; ├── server
│&nbsp;&nbsp; │&nbsp;&nbsp; ├── __init__.py
│&nbsp;&nbsp; │&nbsp;&nbsp; └── views
│&nbsp;&nbsp; │&nbsp;&nbsp;     ├── environment_templates.py
│&nbsp;&nbsp; │&nbsp;&nbsp;     ├── groups.py
│&nbsp;&nbsp; │&nbsp;&nbsp;     ├── __init__.py
│&nbsp;&nbsp; │&nbsp;&nbsp;     ├── instances.py
│&nbsp;&nbsp; │&nbsp;&nbsp;     ├── tasks.py
│&nbsp;&nbsp; │&nbsp;&nbsp;     └── users.py

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

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

我在使用python 2.7的virtualenv中运行它。我今天一直在做这个工作,但我不知道问题出在哪里。一方面,__init__.py似乎对之前的一些进口产品没问题:

1
2
3
from .database import get_db
from .config import parser
from .views import Endpoints, route

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

我尝试过的事情:

  • 重建virtualenv

  • 设置PYTHONPATH

  • 在代码中使用绝对路径

  • 正在查找循环导入

  • 对于如何调试此错误,我愿意提供进一步的建议。

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


    我通常的技巧是在实际情况下打印sys.path,在实际情况下,导入问题会发生。在你的例子中,印刷品的位置似乎在/home/hughdbrown/.local/bin/pserve中。然后检查路径显示的位置中的目录文件。

    你首先要做的是:

    1
    import sys

    在带有打印表达式的python 2中:

    1
    print sys.path

    或者在具有打印功能的python 3中:

    1
    print(sys.path)


    我把PYTHONPATH设为'.',这就帮我解决了问题。

    1
    export PYTHONPATH='.'

    对于一个一行程序,您可以很容易地做到:

    1
    PYTHONPATH='.' your_python_script

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


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

    1
    2
    3
    4
    import sys
    import os

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

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


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

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

    1
    2
    3
    4
    5
    6
    7
    test
    ├── __init__.py
    ├── a
    │&nbsp;&nbsp; ├── __init__.py
    │&nbsp;&nbsp; └── test.py
    └── b
        └── __init__.py

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


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

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

    每种方法都可以运行不同版本的python(·)

    检查命令运行的python版本:键入命令:

    1
    python --version

    检查单击.py时运行的python版本:

    选项1:

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

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

    选项2:

    键入命令:

    1
    2
    assoc .py
    ftype Python.File

    检查路径,如果在命令中识别出模块(例如win32clipboard):

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

    1
    2
    3
    4
    5
    6
    python
    import sys
    sys.executable
    sys.path
    import win32clipboard
    win32clipboard.__file__

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

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

    1
    2
    3
    4
    5
    import sys
    print(sys.executable)
    print(sys.path)
    import win32clipboard
    print(win32clipboard.__file__)

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

    要更改与cmd关联的python版本:

    江户十一〔四〕号在系统变量中,将path变量设置为python版本(路径由;分隔):cmd使用第一个路径,例如:c:path opython27;c:path opython35→cmd将使用python27)

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

    以管理员身份运行命令:

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

    其他:

    "无模块错误"也可能来自语法错误btw python et 3(例如,打印函数缺少括号…)

    ·因此,他们每个人都有自己的PIP版本。


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


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


    我打错字就知道了。我有

    1
    __init.py__

    而不是

    1
    __init__.py

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

    1
    2
    3
    4
    5
    6
    7
    8
    module.py

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

    这样就可以使用第一个module.py,而不是第二个module.py。


    如果这是任何人感兴趣的话,我在Cygwin运行python时也遇到了同样的问题,在我的情况下,我很高兴熊猫没有安装,即使安装了。问题是我安装了两个python——一个安装在windows中,另一个安装在cygwin中(使用cygwin安装程序),虽然这两个版本都是python的相同版本,但是cygwin安装程序对熊猫的安装位置感到困惑。当我卸载cygwin的python并将cygwin指向windows安装时,一切都很好。


    我也有同样的问题。我通过在不同的Python版本中运行该命令来解决这个问题。我试过了。之前我使用的是python 2.7。

    另一种可能是从中导入内容的文件可能包含BOM(字节顺序标记)。它可以通过在支持多种编码的编辑器(如vscode(notepad++)中打开该文件,并以不同的编码标准(如ansi、utf-8(无BOM))保存来解决。