导入错误: “没有名为”的模块

当我开始金字塔保护区时,我得到了这个堆栈痕迹:

% 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的 viralenv 中运行它。我今天一直断断续续地工作,但是我不知道问题出在哪里。一方面,__init__.py似乎可以接受之前进口的 一些:

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

(我把最后一行改成了绝对导入,没找到。)

我尝试过的事情:

  1. 重建 Virtual alenv

  2. 设定 PYTHONPATH

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

  4. 寻找循环进口

关于如何调试此错误,我愿意听取进一步的建议。


所以我犯的错误是只看源树。问题在于我的虚拟执行期函式库。当我查看那里时,我发现所需的文件没有被安装。问题的根源在于 setup.py

302231 次浏览

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

你首先要做的是:

import sys

在 python 3中使用 print 函数:

print(sys.path)

或者在 python 2中使用 print 表达式:

print sys.path

我把 PYTHONPATH调到 '.'就解决了这个问题。

export PYTHONPATH='.'

对于一句俏皮话,你也可以轻松做到:

PYTHONPATH='.' your_python_script

这些命令需要在终端中运行

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

有几种方法可以运行 python 脚本:

  • 双击 file.py 运行(它打开 python 命令行)
  • 从 cmd 提示符(cmd)(拖放)运行 file.py 例如你的档案)
  • 在 IDE 中运行 file.py (例如 pycripter 或 Pycharm)

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


检查哪个 python 版本由 cmd 运行: 输入 cmd:

python --version

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

选项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 不是我要找的人。更改 Python 版本。Py

要更改与 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(例如,打印函数缺少括号...)

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

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

我也有同样的问题。我通过在另一个 Python 版本中运行该命令解决了这个问题。我试过 python3 filename.py。之前我用的是 Python 2.7。

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

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

import sys
import os


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

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

如果有人对此感兴趣的话,我在 Cygwin 运行 Python 的时候也遇到过同样的问题,我的问题是抱怨没有安装熊猫,即使安装了。问题是我有两个 Python 安装程序——一个在 windows,另一个在 Cygwin (使用 Cygwin 安装程序) ,尽管两个都是相同的 Python 版本,但是 Cygwin 安装程序对于熊猫的安装位置感到困惑。当我卸载 Cygwin 的 Python 并指向 Cygwin 的 Windows 安装时,一切都很好

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

module.py


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

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

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

这是我打错字的时候收到的,我打错了

__init.py__

而不是

__init__.py

我的问题是,在 sys.path/PYTHONPATH 中有两个目录——一个是项目根目录,另一个是 Django 中的 apps 目录。

我试图访问 apps 目录中的 Python 模块,但是碰巧在根目录中有一个名称相同的文件夹。Python 在根目录中查找目录,因此没有在 apps 目录中查找目录。

(当然,虽然我正在写这篇文章,因为我会在几个月/几年后回到这里... ...)