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

2024-12-13 08:36:00
admin
原创
178
摘要:问题描述:Python 安装在本地目录中。 我的目录树如下所示:(local directory)/site-packages/toolkit/interface.py 我的代码在这里:(local directory)/site-packages/toolkit/examples/mountain.py 为...

问题描述:

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

我不知道为什么 Python 找不到位于 中的文件sys.path。有什么想法吗?这可能是权限问题吗?我需要一些执行权限吗?


解决方案 1:

根据您对 orip 帖子的评论,我猜测发生了以下情况:

  1. __init__.py在 Windows 上进行了编辑。

  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您在适当的目录中创建并且一切正常......?

解决方案 2:

当我在 LPTHW 中做这个练习时,我遇到了非常类似的事情;我无法让 Python 识别出我调用的目录中有文件。但我最终让它工作了。我所做的和我推荐的是尝试这个:

(注意:从您的初始帖子来看,我假设您正在使用基于 *NIX 的机器并从命令行运行程序,因此此建议是针对这种情况量身定制的。由于我运行的是 Ubuntu,所以我就是这么做的)

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

  2. 当您进入toolkit目录时,在命令行中输入以下代码行:

export PYTHONPATH=.

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

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

解决方案 3:

(local directory)/site-packages/toolkit

__init__.py

为了使导入遍历目录,每个目录都必须有一个__init__.py文件。

解决方案 4:

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

 .:/usr/local/lib/python

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

根据版本的不同,它也可能位于其他位置:

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

解决方案 5:

您正在阅读的这个答案表明您__init__.py在正确的位置,您已经安装了所有依赖项,并且您仍然可以获得ImportError

我遇到了类似的问题,只是我的程序在使用 PyCharm 运行时可以正常运行,但当我从终端运行它时会出现上述错误。进一步挖掘后,我发现PYTHONPATH没有项目目录的条目。因此,我设置PYTHONPATH每个Import 语句在 PyCharm 上有效,但在终端上无效:

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>')

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

解决方案 6:

使用PyCharm(JetBrains 套件的一部分),您需要将脚本目录定义为源:

右键单击 > 将目录标记为 > 源根目录

解决方案 7:

我自己解决了这个问题,下面我会把出错的地方和解决办法写一下总结:

该文件必须完全命名为__init__.py。如果扩展名不同(例如我的情况).py.bin,则 Python 无法在目录中移动,然后无法找到模块。要编辑文件,您需要使用 Linux 编辑器,例如vi或nano。如果您使用 Windows 编辑器,这将写入一些隐藏字符。

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

解决方案 8:

对我来说,这真是太愚蠢了。我使用 安装了库,pip3 install但运行我的程序时使用的是 而python program.py不是python3 program.py

解决方案 9:

python -m pip install <library-name>一个简单的解决方案是使用而不是安装模块,pip install <library-name>
如果管理员限制,可以使用 sudo

解决方案 10:

要将目录标记为包,您需要一个名为 的文件__init__.py

解决方案 11:

如果您尝试了上述所有方法但都失败了,可能是您的模块与内置模块同名。或者,同名sys.path模块存在于优先级高于您的模块的文件夹中。

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

如果没有,请重命名foo或使用绝对导入。

解决方案 12:

对于仍然遇到此问题的所有用户,我认为 Pycharm 与导入混淆了。对我来说,当我写“from namespace import something”时,前一行会用红色下划线标出,表示存在错误,但可以正常工作。但是“from .namespace import something”不会加下划线,但也无法正常工作。

尝试

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

解决方案 13:

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

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

解决方案 14:

我的看法:

在此处输入图片描述

吐:

Traceback (most recent call last):
      File "bashash.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 "bashosh.py", line 69, in <module>
        from game.oblivion.RecordGroups import MobWorlds, MobDials, MobICells, \n    ImportError: No module named RecordGroups

这让我很困惑 - 浏览了很多帖子,建议使用丑陋的 syspath 黑客(如您所见,我的__init__.py都在那里)。结果发现 game/oblivion.py 和 game/oblivion 使 python 感到困惑,它吐出了相当无用的“没有名为 RecordGroups 的模块”。我对解决方法和/或记录此(同名)行为的链接感兴趣 -> 编辑(2017.01.24) - 看看如果我有一个同名的模块和一个包会怎样?有趣的是,通常优先,但显然我们的启动器违反了这一点。

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

解决方案 15:

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

而不是

python myapp/app.py

使用

python -m myapp.app

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

解决方案 16:

  1. 您必须将文件 __ init__.py 与要导入的文件放在同一目录中。

  2. 您不能尝试导入具有相同名称的文件,并且该文件是来自 PYTHONPATH 上配置的两个文件夹的文件。

例如:/etc/environment

PYTHONPATH=$PYTHONPATH:/opt/文件夹1:/opt/文件夹2

/opt/folder1/foo

/opt/folder2/foo

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

从 foo 导入... >>> importerror: 没有名为 foo 的模块

解决方案 17:

就我而言,因为我使用的是 PyCharm,并且 PyCharm 为项目文件夹中的每个项目创建了一个“venv”,但它只是 python 的一个迷你环境。虽然您已经在 Python 中安装了所需的库,但在自定义项目“venv”中,它不可用。这是 PyCharm 中出现“ImportError:没有名为 xxxxxx 的模块”的真正原因。要解决此问题,您必须按照以下步骤将库添加到项目自定义环境中:

  • 在 PyCharm 中,从菜单“文件”->“设置”

  • 在“设置”对话框中,项目:XXXProject->Project Interpreter

  • 单击“添加”按钮,它将显示“可用包”对话框

  • 搜索您的库,点击“安装包”

  • 然后,您需要的所有包都将安装在您的项目自定义“venv”文件夹中。

设置对话框

享受。

解决方案 18:

通过编写修复了我的问题print (sys.path),发现尽管进行了全新安装,但 python 仍在使用过期的软件包。删除这些软件包后,python 会自动使用正确的软件包。

解决方案 19:

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

解决方案 20:

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

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

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

解决方案 21:

我的问题是我将包含文件的目录添加__init__.py到了 PYTHONPATH,但实际上我需要添加它的父目录。

解决方案 22:

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

解决方案 23:

我遇到了同样的问题(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 ...

解决方案比我想象的要简单得多。我将文件夹“Booklet”重命名为“booklet”,就这样。现在 Python 可以通过在“main.py”中使用代码正常导入 Question 类:

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

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

显然,这不是你的问题,但John Fouhy 的回答非常好,并且这个帖子几乎包含了所有可能导致此问题的内容。所以,这是另一件事,我希望这也许可以帮助其他人。

解决方案 24:

在 Linux 服务器上尝试dos2unix script_name

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

如果你在 Windows 上处理脚本,则重新运行

解决方案 25:

就我而言,我曾经使用sys.path.insert()导入本地模块,并module not found从不同的库中获取。我必须将其放在sys.path.insert()报告的导入下方module not found。我猜最好的做法是将其放在sys.path.insert()导入的底部。

解决方案 26:

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

解决方案 27:

如果你的时间紧迫,而且其他一切都失败了:

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

解决方案 28:

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

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

我可能只需删除特定pyc文件即可解决问题,但我从未尝试过

解决方案 29:

我遇到了同样的问题:Import error。此外,库已 100% 正确安装。问题的根源在于我的 PC 上安装了 3 个版本的 python(anaconda 包)。这就是为什么库没有安装到正确的位置。之后,我只需在我的 IDE PyCharm 中更改为正确的 python 版本即可。

解决方案 30:

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

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用