导入错误:'没有名为'的模块*确实存在

时间:2014-05-01 22:44:47

标签: python python-import

当我开始金字塔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似乎可以使用以前出现的一些导入:

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

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

我尝试过的事情:

  1. 重建virtualenv

  2. 设置PYTHONPATH

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

  4. Looking for circular imports

  5. 我愿意就如何调试此错误提供进一步的建议。


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

11 个答案:

答案 0 :(得分:45)

我通常的诀窍是在发生导入问题的实际环境中简单地打印sys.path。在您的情况下,打印的位置似乎在/home/hughdbrown/.local/bin/pserve。然后检查dirs&amp;路径显示的地方的文件..

你首先要做到这一点:

import sys

并在python 2中使用print expression:

print sys.path

或在python 3中使用print函数:

print(sys.path)

答案 1 :(得分:45)

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

export PYTHONPATH='.'

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

PYTHONPATH='.' your_python_script

这些命令应在终端中运行

答案 2 :(得分:4)

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

import sys
import os

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

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

答案 3 :(得分:3)

我遇到了同样的问题,我在错误行之前尝试了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

答案 4 :(得分:2)

它们有几种运行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

输入cmd:

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使用FIRST路径,例如: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之后)。

其他

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

¤因此他们每个人都拥有自己的点子版本

答案 5 :(得分:1)

我也遇到过这个问题,在执行程序之前,我忘了在终端输入myproject工作。

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

如果您的脚本与另一个目录中的模块名称相同,则会使用该脚本。例如:

module.py

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

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

答案 10 :(得分:0)

我在输入错误内容时得到了此提示。我有

__init.py__ 

代替

__init__.py