导入错误:“无模块命名为” * *不存在

问题描述 投票:47回答:11

当我开始金字塔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

这工作正常,从蟒蛇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

我愿意进一步如何调试这个错误的建议。


所以我所犯的错误是只查看源代码树。问题是真的在运行时环境,在我的virtualenv。当我看着那里,我发现没有安装所需的文件。这个问题,从根本上讲是setup.py

python python-import
11个回答
47
投票

我惯用的伎俩是简单地在进口问题发生的实际情况下打印sys.path。在你的情况下,它会似乎是对印刷品的地方是在/home/hughdbrown/.local/bin/pserve。然后,检查显示目录和文件在该路径显示的地方..

你做到这一点,首先有:

import sys

和在Python 2与打印表达式:

print sys.path

或在Python 3与打印功能:

print(sys.path)

0
投票

如果您在另一个目录中具有相同名称的脚本作为模块,它将使用代替。例如:

module.py

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

这将让这个正在使用的第一module.py,没有第二个。


0
投票

我得到这个时候我没有输入正确的事情。我有

__init.py__ 

代替

__init__.py

48
投票

我设置了PYTHONPATH'.'并解决它适合我。

export PYTHONPATH='.'

对于一个班轮你可以为很容易做到:

PYTHONPATH='.' your_python_script

预计这些命令在终端中运行


6
投票

我有同样的问题,我通过添加以下代码到Python文件的顶部解决它:

import sys
import os

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

os.path.dirname的重复次数取决于其中文件位于您的项目层次结构。举例来说,在我的情况下,项目的根是三个层次的。


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


2
投票

他们通过多种方式来运行python脚本:

  • 通过file.py双击运行(它打开python命令行)
  • 从运行在CMD提示您file.py(CMD)(拖/放你的文件就可以了,例如)
  • 在IDE中运行file.py(如pyscripter或Pycharm)

每一种方法都可以运行不同版本的Python(¤)


检查哪些Python版本是由CMD运行:键入CMD:

python --version 

检查哪些Python版本上的.py单击后运行:

选项1:

创建一个包含这一个test.py:

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

选项2:

键入在cmd中:

assoc .py
ftype Python.File

检查路径,如果模块(例如:win32clipboard)在cmd中确认:

创建一个包含这一个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

要更改与CMD相关的Python版本:

Control Panel\All Control Panel Items\System\Advanced system setting\Environnement variable系统变量的path变量设置为你蟒版本(由;分开的路径:CMD使用第一路径例如:C:\路径\到\ Python27; C:\路径\到\ 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)。

其他:

“无模块错误”也可能来自一个语法错误,顺便说一句蟒蛇等3(例如缺少打印功能括号...)

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


1
投票

我有这个问题太,我刚刚忘了执行我的计划之前,请在终端workon的myproject。


1
投票

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


0
投票

我遇到过同样的问题。我在不同的Python版本上运行该命令解决了这个问题。我试过python3 filename.py。早些时候,我使用Python 2.7。

另一种可能性是从哪个东西是导入的文件可能包含BOM(字节顺序标记)。它可以通过在支持多种编码像VSCode(记事本++)一些编辑器中打开该文件并保存在不同的编码statndard像ANSI,UTF-8(无BOM)来解决。


0
投票

在这种情况下感兴趣的是谁,我当我在Cygwin中运行的Python,在我的情况下,它是complaning,大熊猫,即使是未安装有同样的问题。问题是,我有蟒2个安装 - 一个在Windows和另一位在Cygwin的(使用cygwin的安装程序),虽然两人都Python的相同版本,在Cygwin安装感到困惑安装熊猫在哪里。当我卸载Cygwin的Python和在Windows安装都指出Cygwin的很好

© www.soinside.com 2019 - 2024. All rights reserved.