Python错误“ImportError:没有模块命名”;

Python安装在本地目录。

我的目录树是这样的:

(local directory)/site-packages/toolkit/interface.py

我的代码在这里:

(local directory)/site-packages/toolkit/examples/mountain.py

为了运行这个例子,我写了python mountain.py,在代码中我有:

from toolkit.interface import interface

我得到了一个错误:

Traceback (most recent call last):
File "mountain.py", line 28, in ?
from toolkit.interface import interface
ImportError: No module named toolkit.interface

我已经检查了sys.path,我有目录/site-packages。此外,我在工具包文件夹中有__init__.py.bin文件,以向Python表明这是一个包。我在examples目录中也有一个__init__.py.bin

我不知道为什么Python在sys.path中找不到该文件。什么好主意吗?会是权限问题吗?我需要一些执行许可吗?

2219128 次浏览

要将一个目录标记为包,需要一个名为__init__.py的文件,这有帮助吗?

(local directory)/site-packages/toolkit

__init__.py?

要通过目录导入,每个目录必须有一个__init__.py文件。

根据你对orip帖子的评论,我猜事情是这样的:

  1. 你在windows上编辑了__init__.py
  2. windows编辑器添加了一些非打印的东西,可能是回车符(windows中的行尾是CR/LF;在unix中只能是LF),或者可能是CTRL-Z (windows文件结束符)。
  3. 您使用WinSCP将文件复制到unix机。
  4. WinSCP认为:“这不是基本的文本;我将用。bin扩展名表示二进制数据。”
  5. 缺少__init__.py(现在称为__init__.py.bin)意味着python不理解工具包作为一个包。
  6. 您在适当的目录中创建了__init__.py,一切工作正常…?

我解决了我自己的问题,我将写一篇总结错误的事情和解决方案:

该文件需要精确地命名为__init__.py。如果扩展名不同,例如在我的例子中.py.bin,那么Python无法通过目录移动,然后它无法找到模块。要编辑文件,您需要使用Linux编辑器,例如6纳米。如果你使用Windows编辑器,它会写一些隐藏字符。

另一个影响它的问题是,我用root安装了另一个Python版本,所以如果有人使用本地安装的Python,请确保运行程序的Python安装是本地Python。要检查这一点,只需执行which python,并查看可执行文件是否是本地目录中的那个。如果不是,请更改路径,但要确保本地Python目录比其他Python目录更早。

是的。您需要该目录包含__init__.py文件,该文件是初始化包的文件。这里,看看

需要__init__.py文件才能使Python将目录视为包含包;这样做是为了防止具有通用名称的目录(如string)在无意中隐藏之后在模块搜索路径上出现的有效模块。在最简单的情况下,__init__.py可以只是一个空文件,但它也可以执行包的初始化代码或设置__all__变量,稍后将介绍。

在*nix上,还要确保PYTHONPATH配置正确,特别是它具有以下格式:

 .:/usr/local/lib/python

(注意开头的.:,这样它也可以在当前目录上搜索。)

它也可能在其他位置,取决于版本:

 .:/usr/lib/python
.:/usr/lib/python2.6
.:/usr/lib/python2.7 and etc.

在我的情况下,问题是我链接到调试 python &boost::Python,这要求扩展名是FooLib_d.pyd,而不仅仅是FooLib.pyd;重命名文件或更新CMakeLists.txt属性修复了错误。

  1. 您必须将文件__ init__.py放在您要导入的文件所在的同一目录中。
  2. 不能尝试从PYTHONPATH上配置的两个文件夹中导入同名的文件。
< p >如: /etc/environment < / p >

PYTHONPATH = $ PYTHONPATH: / opt / folder1 / opt / folder2

/ opt / folder1 / foo

/ opt / folder2 / foo

而且,如果你试图导入foo文件,python将不知道你想要哪个。

从foo import…>>> importerror:没有foo模块

当我在LPTHW中做这个练习时,我遇到了非常相似的情况;我永远无法让Python识别我调用的目录中有文件。但最后我还是让它工作了。我所做的,以及我所推荐的,是这样做的:

(注意:从你最初的文章中,我假设你使用的是基于* nix的机器,并从命令行运行,所以这个建议是为你量身定做的。因为我运行Ubuntu,这是我所做的)

  1. 将目录(cd)更改为文件所在的目录以上。在本例中,您尝试运行mountain.py文件,并尝试调用toolkit.interface.py模块,这两个模块位于不同的目录中。在本例中,您将转到包含这两个文件的路径的目录(换句话说,这两个文件的路径共享的最近的目录)。在本例中是toolkit目录。

  2. 当你在toolkit目录中,在你的命令行上输入这行代码:

    # EYZ0

    这将您的PYTHONPATH设置为".",这基本上意味着您的PYTHONPATH现在将在您当前所在目录(更重要的是,在您所在目录的子目录的分支中)中查找任何被调用的文件。因此,它不只是在您的当前目录中查找,而是在您的当前目录中的所有目录中查找)。

  3. 在上面的步骤中设置了PYTHONPATH之后,从当前目录(toolkit目录)运行模块。Python现在应该找到并加载您指定的模块。

希望这能有所帮助。我自己也很沮丧。

Linux:导入的模块位于/usr/local/lib/python2.7/dist-packages中

如果你使用的是C语言编译的模块,不要忘记在sudo setup.py install之后修改。so文件。

sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so

在遭受同样的问题后,我发现我的解决方案是从我的项目中删除所有pyc文件,似乎这些缓存文件以某种方式导致了这个错误。

我发现最简单的方法是在Windows资源管理器中导航到我的项目文件夹,搜索*.pyc,然后选择所有(Ctrl+一个)并删除它们(Ctrl+X)。

我可以通过删除特定的pyc文件来解决我的问题,但我从未尝试过这样做

我的观点是:

enter image description here

随地吐痰:

Traceback (most recent call last):
File "bash\bash.py", line 454, in main
import bosh
File "Wrye Bash Launcher.pyw", line 63, in load_module
mod = imp.load_source(fullname,filename+ext,fp)
File "bash\bosh.py", line 69, in <module>
from game.oblivion.RecordGroups import MobWorlds, MobDials, MobICells, \
ImportError: No module named RecordGroups
这让我很困惑-浏览了帖子和帖子,建议丑陋的syspath黑客(正如你看到的,我的__init__.py都在那里)。game/遗忘。py和game/遗忘让人很困惑 它吐出了相当无用的“没有名为RecordGroups的模块”。我对一个解决方案和/或记录此(相同名称)行为的链接感兴趣-> EDIT(2017.01.24) -看看如果我有一个模块和一个包具有相同的名称怎么办?有趣的是,通常优先,但显然我们的启动器违反了这一点

编辑(2015.01.17):我没有提到我们使用自定义启动器解剖在这里

我也遇到了同样的问题:Import error。此外,库已经100%正确安装。问题的根源是在我的PC上安装了3版的python (anaconda包)。这就是为什么图书馆没有安装在正确的地方。之后,我只是在我的IDE PyCharm中更改了适当的python版本。

通过编写print (sys.path)来修复我的问题,并发现尽管清洁安装,python仍在使用过时的包。删除这些会使python自动使用正确的包。

我也犯了同样的错误。这是由于有人在与我的脚本相同的文件夹中创建了一个文件夹,该文件夹的名称与我从其他地方导入的模块冲突。它没有导入外部模块,而是在这个显然不包含预期模块的文件夹中查找。

使用PyCharm (JetBrains套件的一部分),你需要定义你的脚本目录为Source:
# EYZ0 < / p >

如果你已经尝试了上面提供的所有方法但都失败了,可能你的模块有同样的名字作为内置模块。或者,一个有同样的名字的模块存在于一个文件夹中,它在sys.path中的优先级比你的模块的优先级高。

要调试,说你的from foo.bar import baz投诉ImportError: No module named bar。更改为import foo; print foo,这将显示foo的路径。这是你所期望的吗?

如果不是,重命名foo或使用绝对的进口

一个简单的解决方案是使用python -m pip install <library-name>而不是pip install <library-name>来安装模块 您可以在管理限制的情况下使用sudo

我的问题是,我将带有__init__.py文件的目录添加到PYTHONPATH,而实际上我需要添加它的父目录。

我有同样的问题(Python 2.7 Linux),我已经找到了解决方案,我想分享它。在我的情况下,我有下面的结构:

Booklet
-> __init__.py
-> Booklet.py
-> Question.py
default
-> __init_.py
-> main.py

在'main.py'中,我尝试了以下所有的组合,但都失败了:

from Booklet import Question
from Question import Question
from Booklet.Question import Question
from Booklet.Question import *
import Booklet.Question
# and many othet various combinations ...

解决办法比我想象的要简单得多。我把文件夹“小册子”重命名为“小册子”,就是这样。现在Python可以通过在'main.py'中使用代码来正常导入类Question:

from booklet.Booklet import Booklet
from booklet.Question import Question
from booklet.Question import AnotherClass

由此我可以得出结论,像“小册子”这样的包名(文件夹)必须以小写开头,否则Python会将其与类名和文件名混淆。

显然,这不是你的问题,但是约翰Fouhy的的答案非常好,这个线程几乎有任何可能导致这个问题的东西。所以,这是另一件事,我希望这能帮助到其他人。

在我的例子中,我包含了打包路径。鸡蛋文件夹,而不是下面的实际包裹。我复制包到顶级,它工作。

你正在阅读这个答案说你的__init__.py是在正确的地方,你已经安装了所有的依赖项,你仍然得到ImportError

我也遇到了类似的问题,除了我的程序在使用PyCharm运行时运行良好,但当我从终端运行时出现上述错误。在深入研究之后,我发现PYTHONPATH没有项目目录的条目。所以,我设置PYTHONPATH导入语句在PyCharm上工作,但不能从终端:

export PYTHONPATH=$PYTHONPATH:`pwd`  (OR your project root directory)

还有另一种方法可以使用sys.path as:

import sys
sys.path.insert(0,'<project directory>') OR
sys.path.append('<project directory>')

您可以根据希望搜索项目的顺序使用插入/追加。

在我的例子中,因为我使用PyCharm和PyCharm为项目文件夹中的每个项目创建一个“venv”,但它只是python的一个迷你env。虽然您已经在Python中安装了所需的库,但在您的自定义项目“venv”中,它不可用。这是PyCharm中出现'ImportError: No module named xxxxxx'的真正原因。 要解决此问题,您必须按以下步骤向项目自定义env添加库
  • 在PyCharm中,从菜单“文件”->设置
  • 在“设置”对话框中,输入“项目:XXXProject->项目解释器”
  • 点击“添加”按钮,会弹出“Available Packages”对话框
  • 搜索你的库,点击“安装包”
  • 然后,所有你需要的包将安装在你的项目自定义的“venv”文件夹。

Settings dialog

享受。

这对我很有用: 在父文件夹中创建__init__.py文件(在您的情况下,在site-packages文件夹中)。然后像这样导入:

from site-packages.toolkit.interface import interface

希望对你也有用!

致所有还有这个问题的人。我相信Pycharm与import混淆了。对我来说,当我写“从命名空间导入一些东西”时,前一行会用红色划线,表明有错误,但有效。然而,“from .namespace import something”没有下划线,但也不起作用。

试一试

try:
from namespace import something
except NameError:
from .namespace import something

对我来说,这是件非常愚蠢的事。我使用pip3 install安装了这个库,但是我运行的程序是python program.py,而不是python3 program.py

在linux服务器上尝试dos2unix script_name

(删除所有(如果有)pyc文件使用命令find . -name '*.pyc' -delete)

如果你在Windows上使用脚本,重新运行

在我的例子中,我使用sys.path.insert()导入一个本地模块,并从另一个库中获得module not found。我必须把sys.path.insert()放在报告module not found的导入下面。我认为最好的做法是将sys.path.insert()放在导入的底部。

如果您正在使用安装脚本/实用程序(例如setuptools)来部署您的包,不要忘记将相应的文件/模块添加到安装程序中。


在支持的情况下,使用find_packages()或类似的方法自动向设置脚本添加新包。如果你先把项目搁置一段时间,然后再添加一些东西,特别是绝对会让你免去头疼的事情。

import setuptools


setuptools.setup(
name="example-pkg",
version="0.0.1",
author="Example Author",
author_email="author@example.com",
description="A small example package",
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"Operating System :: OS Independent",
],
python_requires='>=3.6',
)

(示例取自setuptools文档)

我发现改变别名文件夹(Mac)的名称(通过GUI)会导致加载模块的问题。如果原文件夹名称已更改,请重新制作符号链接。我不确定这种行为有多普遍,但调试起来很令人沮丧。

我也有类似的问题。我创建了一个名为python3.6的新虚拟环境。

conda create -n python3.6 python=3.6
pip install pandas

一切正常,但当我运行脚本时,发生了一个错误

ModuleNotFoundError: No module named 'pandas'
我发现Python包的元数据和pip的缓存已经更新,但它实际上没有下载pandas包。 所以我尝试重新安装pip,

pip uninstall pandas --no-cache-dir
pip install pandas

这就解决了问题。

在ubuntu apt-get安装程序中,python3版本的包通常被命名

python3-XYZ

以及python2版本

python-XYZ
根据经验,尝试错误消息中提到的包的python3-XYZpython-XYZ。 不需要猜测,使用RegEx搜索apt缓存。然后:< / p >
$ apt-cache search "python.*toolkit.*interface"
python3-cli-helpers - easy command-line apps with Python
python3-exam - Python module to help write better tests
python3-fltk - Python wrapper for the Fast Light Toolkit
python3-mpltoolkits.basemap - matplotlib toolkit to plot on map projections (Python 3)
python3-nltk - Python3 libraries for natural language processing
python3-onnx - Open Neural Network Exchange (ONNX) (Python)
python3-paraview - Parallel Visualization Application. python-support
python3-pyswarms - research toolkit for particle swarm optimization in Python
python3-wxgtk-media4.0 - Python 3 interface to the wxWidgets Cross-platform C++ GUI toolkit (wx.media)
python3-wxgtk-webview4.0 - Python 3 interface to the wxWidgets Cross-platform C++ GUI toolkit (wx.html2)
python3-wxgtk4.0 - Python 3 interface to the wxWidgets Cross-platform C++ GUI toolkit
python3-xapian - Xapian search engine interface for Python3
wxglade - GUI designer written in Python with wxPython

它没有找到它。

请注意,这个apt-get技巧有时也需要用于依赖的包。

我对python2.7的flask包有相同的错误消息,当我尝试时它消失了:

sudo apt-get install python-flask

因此,试一试:

sudo apt-get install python-[YOURPYTHONVERION]-[YOURERRORPACKAGE]

或者检查上面提到的依赖关系。

使用sys.path.append对我有用,就像在回答中提到的那样。起初,我认为它不能工作,直到我意识到在目录路径之前有一个空格。所以要确保路径前没有错别字或空格

所有python文件的文件编码必须为utf-8。

看这里:https://github.com/jupyter/notebook/issues/3166#issuecomment-581332097

对我来说,将该文件作为模块运行很有帮助。

而不是

python myapp/app.py

使用

python -m myapp.app

这并不完全相同,但在某些情况下这可能是一种更好的方法。

如果你时间紧迫,其他方法都失败了:

import sys
import os
wd = '/path/to/current/script/'
sys.path.append(wd)
os.chdir(wd)
print(os.getcwd())
print(sys.path)

另一个原因导致了这个问题

# EYZ0

#!/bin/python
from bs4 import BeautifulSoup
  • 如果默认pythonpyyhon2
$ file $(which python)
/sbin/python: symbolic link to python2
  • file.py需要python3,在这种情况下(bs4)
  • 你不能像这样使用python2来执行这个模块:
$ python file.py
# or
$ file.py
# or
$ file.py # if locate in $PATH
  • 两种方法来解决这个error
# should be to make python3 as default by symlink
$ rm $(which python) && ln -s $(which python3) /usr/bin/python
# or use alias
alias python='/usr/bin.../python3'

或者将file.py中的shebang改为

#!/usr/bin/...python3