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

时间:2008-12-03 21:26:28

标签: python importerror python-import

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。另外,我在toolkit文件夹中有文件__init__.py.bin,以向Python表明这是一个包。我在示例目录中也有__init__.py.bin

我不知道为什么Python在sys.path时无法找到该文件。有任何想法吗?可以是权限问题吗?我需要一些执行权限吗?

31 个答案:

答案 0 :(得分:235)

根据您对orip帖子的评论,我想这就是发生的事情:

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

答案 1 :(得分:58)

确实

(local directory)/site-packages/toolkit

有一个__init__.py

要在目录中导入 walk ,每个目录都必须有__init__.py个文件。

答案 2 :(得分:37)

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

 .:/usr/local/lib/python

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

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

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

答案 3 :(得分:34)

当我在LPTHW做这个练习时,我碰到了一些非常相似的东西;我永远无法让Python认识到我在调用的目录中有文件。但我最终能够让它发挥作用。我做了什么,我推荐的是尝试这个:

(注意:从您的初始帖子开始,我假设您使用的是基于* NIX的计算机,并且正在从命令行运行,因此这个建议是针对此定制的。因为我运行Ubuntu,这就是我所做的)

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

2)当您在tookit目录中时,在命令行中输入以下代码行:

export PYTHONPATH=.

这会将您的PYTHONPATH设置为“。”,这基本上意味着您的PYTHONPATH现在将查找您当前所在目录中的任何被调用文件(并且更重要的是,在子目录分支< / em>你所在的目录。所以它不只是查看当前目录,而是查看 当前目录中的所有目录。)

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

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

答案 4 :(得分:22)

我解决了自己的问题,我将写出错误和解决方案的摘要:

需要准确调用该文件__init__.py。如果扩展名不同,例如在我的情况.py.bin中,则Python无法移动目录,然后无法找到模块。要编辑文件,您需要使用Linux编辑器,例如vinano。如果您使用Windows编辑器,则会写一些隐藏的字符。

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

答案 5 :(得分:16)

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

答案 6 :(得分:16)

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

答案 7 :(得分:12)

使用PyCharm(JetBrains套件的一部分),您需要将脚本目录定义为Source:
Right Click > Mark Directory as > Sources Root

答案 8 :(得分:8)

对我来说,那真是愚蠢。我使用pip3 install安装了库,但程序以python program.py而非python3 program.py的身份运行。

答案 9 :(得分:6)

  1. 您必须将文件__ init__.py放在要导入的文件的同一目录中。
  2. 您无法尝试导入具有相同名称的文件,并且是PYTHONPATH中配置的2个文件夹中的文件。
  3. 例如: 的/ etc /环境

    PYTHONPATH = $ PYTHONPATH中:/ opt / folder1中:/选择/文件夹2

    的/ opt / folder1中/富

    的/ opt /文件夹2 /富

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

    来自foo import ...&gt;&gt;&gt; importerror:没有名为foo的模块

答案 10 :(得分:6)

烨。您需要该目录包含__init__.py文件,该文件是初始化程序包的文件。在这里,请查看this

  

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

答案 11 :(得分:4)

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

如果您使用的是用C编译的模块,请不要忘记在sudo setup.py install之后chmod .so文件。

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

答案 12 :(得分:4)

我的两分钱:

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都在那里)。事实证明,游戏/ oblivion.py和游戏/遗忘令人困惑的蟒蛇 吐出了相当无益的#34;没有名为RecordGroups&#34;的模块。我对解决此(同名)行为的变通方法和/或链接感兴趣 - &gt;编辑(2017.01.24) - 看看What If I Have a Module and a Package With The Same Name?有趣的是,通常优先,但显然我们的发射器违反了这一点。

编辑(2015.01.17):我没有提及我们使用custom launcher解剖here

答案 13 :(得分:4)

您正在阅读此答案,说明您的__init__.py在正确的位置,您已经安装了所有依赖项,并且仍在获取ImportError

我面临类似的问题,除了我的程序在使用PyCharm运行时可以正常运行,但是从终端运行时出现上述错误。进一步挖掘之后,我发现PYTHONPATH没有项目目录的条目。因此,我为Import statement works on PyCharm but not from terminal设置了PYTHONPATH

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

还有另一种使用sys.path的方式:

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

您可以根据想要搜索项目的顺序使用插入/添加。

答案 14 :(得分:3)

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

答案 15 :(得分:3)

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

答案 16 :(得分:2)

如果您尝试过上面提供的所有方法但都失败了,那么您的模块可能与内置模块具有相同的名称。或者,在sys.path中具有高于您的模块的优先级的文件夹中存在同名的模块。

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

如果没有,请重命名foo或使用absolute imports

答案 17 :(得分:1)

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

答案 18 :(得分:1)

就我而言,因为我正在使用PyCharm和PyCharm在项目文件夹中为每个项目创建一个“ venv”,但这只是python的迷你环境。尽管您已经在Python中安装了所需的库,但是在您的自定义项目“ venv”中,该库不可用。这是PyCharm中发生“导入错误:没有名为xxxxxx的模块”的真正原因。 要解决此问题,必须通过以下步骤将库添加到项目自定义环境中:

  • 在PyCharm中,从菜单“文件”->“设置”
  • 在“设置”对话框中,项目:XXXProject->项目解释器
  • 单击“添加”按钮,它将显示“可用软件包”对话框
  • 搜索您的图书馆,点击“安装软件包”
  • 然后,所有需要的软件包将安装在项目自定义的“ venv”文件夹中。

Settings dialog

享受。

答案 19 :(得分:0)

我也有类似的问题。我创建了一个名为 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 

解决了

答案 20 :(得分:0)

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

答案 21 :(得分:0)

如果您使用安装脚本/实用程序(例如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 documentation

答案 22 :(得分:0)

就我而言,我正在使用sys.path.insert()导入本地模块,并从其他库中获取module not found。我不得不将sys.path.insert()放在报告module not found的进口下方。我想最好的做法是将sys.path.insert()放在导入的底部。

答案 23 :(得分:0)

在linux服务器中,尝试dos2unix script_name

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

,如果您在Windows上处理脚本,请重新运行

答案 24 :(得分:0)

向所有仍然有此问题的人。我相信Pycharm与进口商品混淆了。对我来说,当我写“从名称空间导入某物”时,前一行用红色下划线标出,表示有错误,但可以。但是,“从.namespace导入某些内容”不会带有下划线,但也无法正常工作。

尝试

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

答案 25 :(得分:0)

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

from site-packages.toolkit.interface import interface

希望对您也有用!

答案 26 :(得分:0)

就我而言,我包含的是package.egg文件夹的路径,而不是其下面的实际软件包。我将软件包复制到顶层,并且可以正常工作。

答案 27 :(得分:0)

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

[2]

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

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

解决方案比我想象的要简单得多。我将文件夹“Booklet”重命名为“booklet”,就是这样。现在Python可以通过在'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 ...

由此可以得出结论,像'booklet'这样的Package-Names(文件夹)必须从小写字母开始,否则Python会将它与类名和文件名混淆。

显然,这不是你的问题,但 John Fouhy的答案非常好,这个帖子几乎可以引起这个问题。所以,这还有一件事,我希望也许这可以帮助别人。

答案 28 :(得分:0)

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

答案 29 :(得分:0)

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

答案 30 :(得分:0)

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

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

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