ChatGPT解决这个技术问题 Extra ChatGPT

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 表明这是一个包。我在示例目录中也有一个 __init__.py.bin

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

检查您是否具有从 python 读取该文件的权限。请参阅:stackoverflow.com/a/20999950/1657225
请务必将您的目录标记为“Resources Root”,让 PyCharm 知道这是一个包。
我的问题是新安装的模块的权限不是755。那是因为机器上的 umask0027,由于 others 没有 read 权限导致模块无法读取。添加 read 权限解决了我的问题。安装后检查目标目录的权限是值得的。
也许本地目录名称是 interface (已经发生冲突)。

J
John Fouhy

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

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


另外, python -c 'import sys; print sys.path' 有帮助 - 有时用户将文件放置在未扫描的路径中。
我使用的是相同的东西,除了 WinSCP 没有附加 .bin
如果我有一个空的“__init__.py”会发生同样的事情吗?
天哪,你统治!这是我的故事: 1. 你在 Windows 上编辑了 init.py 2. 它添加了一个 TAB 而不是空格 3. 你在谷歌上搜索了很多,直到找到这篇文章! ;)
对我来说,问题是我使用的是 python driver.py,而我应该使用 python3 driver.py,因为我安装了 pip3
i
igorgue

(local directory)/site-packages/toolkit

__init__.py

要使 import walk 遍历您的目录,每个目录都必须有一个 __init__.py 文件。


好点子!备注:从 Python 3.3 开始,sys.path 上与包名匹配的任何目录都将被识别。
这不只是相对路径引用所必需的吗?为什么每个目录都必须有它?
H
Harun Yilmaz

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

(注意:从您最初的帖子中,我假设您使用的是基于 *NIX 的机器并从命令行运行,因此此建议是针对此量身定制的。由于我运行 Ubuntu,这就是我所做的)

将目录 (cd) 更改为文件所在目录之上的目录。在这种情况下,您尝试运行 mountain.py 文件,并尝试调用位于不同目录中的 toolkit.interface.py 模块。在这种情况下,您将转到包含这两个文件的路径的目录(或者换句话说,这两个文件的路径共享的最近的目录)。在这种情况下是工具包目录。当您在工具包目录中时,在命令行中输入这行代码:export PYTHONPATH=。这会将您的 PYTHONPATH 设置为“。”,这基本上意味着您的 PYTHONPATH 现在将在您当前所在的目录中查找任何被调用的文件(更重要的是,在您所在目录的子目录分支中。因此,它不仅会查看当前目录,还会查看当前目录中的所有目录)。在上述步骤中设置好 PYTHONPATH 后,从当前目录(工具包目录)运行模块。 Python 现在应该找到并加载您指定的模块。

希望这可以帮助。我自己对此感到非常沮丧。


或在 Windows set PYTHONPATH=. 上。
这对我有用。还完全简化了我的 PYTHONPATH 挫折,因为每次切换机器时我都必须将其更新为绝对路径。谢谢你,谢谢你,谢谢你。
如果您在现有的 PYTHONPATH 环境变量中有第三方或自定义库引用,请务必小心。如果您改为运行:set PYTHONPATH=%PYTHONPATH%;.;. 附加到 PYTHONPATH,然后 echo %PYTHONPATH% 应显示 path\to\custom\library;.;。然后使用 python applicationlaunchfile.py 从应用程序目录运行您的应用程序。
P
Peter Mortensen

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

 .:/usr/local/lib/python

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

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

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

也可能是 .:/usr/lib/python.:/usr/lib/python2.6.:/usr/lib/python2.7 等,具体取决于版本
对我来说,该模块位于 /usr/local/lib/python3.4/dist-packages 但是当我在终端(ubuntu)中键入 python3 并尝试导入它时,它不允许我说它不存在。 “ImportError:不存在模块 x”
在文件末尾添加 #!/usr/bin/python 也应该有效,对吧?
@Nearoo 我认为这行不通。另外,通常这个 shebang 会添加到文件的顶部。
在 MacOSX 上,通过将 PYTHONPATH=/usr/local/lib/python2.7/site-packages 添加到启动脚本来修复它。
j
jww

您正在阅读此答案,表明您的 __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>')

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


这是我作为解决方法所做的。但我仍然不明白为什么这应该是必要的。我在我的 Pipfile 中有一个相对路径模块,如果没有上述解决方法,则无法检测到该模块(例如,我得到 ImportError)。
这很棒。如果您确定自己走在正确的道路上,应用它的一般方法:sys.path.append(os.getcwd())
这确实是救生员
M
MonoThreaded

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


谢谢,这绝对需要继承遗留项目,所有模块都位于 /src 目录之外的平面层次结构中
N
Nicolas Gervais

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


谢谢!如果您在默认安装了 Python2 (OS X) 的系统上运行,认为这是一个常见错误
P
Peter Mortensen

我自己解决了自己的问题,我会写一个错误的总结和解决方法:

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

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


我遇到的一个问题是pip(重新)安装了一个模块,只有root用户可以访问它,所以运行程序的用户看不到它。
@JānisElmeris 您能否详细说明上述评论,我想我也面临类似的错误。我将 __init__.py 文件放在相关目录中,但我使用 setup.py 手动安装了一个包。安装新软件包会如何干扰进口。
@darth_coder,对不起,那是六年前的事了,我不记得了。另外,我很少使用 Python,最近完全没有。从我写的内容来看,我可以认为我以 root 身份安装了一个包,它更改了权限,因此其他用户没有以前的访问权限。
o
orip

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


我已经有一个名为 init.py.bin 的文件,如果将名称更改为 init.py,则会收到此错误:/__init__.py", line 1 "utilities", "demo"] ^ SyntaxError: invalid syntax
init.py 中有什么?请把它作为你问题的一部分发布。
什么都没有,它是空的,它是我下载的包,我需要在文件中写一些东西吗?
@S.Lott:您不需要在 init.py 中添加任何内容,对吗?
@爱德华多。您的 init.py 出现错误。你说它是空的。这很难调和。它不能被称为 init.py.bin——Python 会忽略这个文件。通常,它可以没有任何内容。
B
Badr Bellaj

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


python -mpip install 前面实现了什么?
@sporc - 当您使用 -m 命令行标志时,Python 将为您导入模块或包,然后将其作为脚本运行。当您不使用 -m 标志时,您命名的文件将作为脚本运行。
不确定这个答案试图说什么 python -m pip... 有效,但 pip... 没有:假设它们实际上位于同一个 python 目录中,它们实际上是同一件事。可能,观察到的情况是独立的 pip 程序在某些较旧的 python 版本中不可用(但它现在在最新的 2.7 和 3.x 中)。在这种情况下,python 在本地 virtualenv 中,而 pip 不在,因此 python -m pip install 将安装在本地 virtualenv 中,而 pip 将尝试安装在系统 python 中(并且失败 w/o须藤)。无论如何,这没有意义。
A
AKJ

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

尝试

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

第一个是python 2语法,第二个是python 3。
R
Raphael Schweikert

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

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


I
Iasmini Gomes

您必须将文件 __ init__.py 放在与您要导入的文件相同的目录中。您不能尝试从 PYTHONPATH 上配置的 2 个文件夹中导入具有相同名称的文件。

例如:/etc/环境

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

/opt/folder1/foo

/opt/folder2/foo

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

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


C
Community

我的两分钱:

https://i.stack.imgur.com/oHpHx.jpg

吐:

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 hack 的帖子和帖子(正如你所见,我的 __init__.py 都在那里)。事实证明,game/oblivion.py 和 game/oblivion 混淆了 python,它吐出了相当无用的“没有名为 RecordGroups 的模块”。我会对记录此(同名)行为的解决方法和/或链接感兴趣->编辑 (2017.01.24) - 看看 What If I Have a Module and a Package With The Same Name? 有趣的是通常 packages 优先,但显然我们的启动器违反了这一点。

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


更像是路径已经关闭。 game.oblivion.RecordGroups !== game/oblivion/patchers/RecordGroups.py 可能希望通过附加要使用的 Python 代码来解决此问题:game.oblivion.patchers.RecordGroups
@DwightSpencer:我确定我在 game.oblivion.__init__.py 中导入了“RecordGroups”,但可能需要检查一下
l
liushuaikobe

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

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

如果不是,请重命名 foo 或使用 absolute imports


对我来说,这会产生 ImportError: No module named foo
d
dukevin

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


Y
Yuanhui

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

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

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

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

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

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

https://i.stack.imgur.com/SFpY9.png

享受。


K
KrisWebDev

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

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

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

P
Peter Mortensen

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


R
Rich

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


m
michael-slx

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


i
ioaniatr

我有同样的问题(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”中使用代码来正常导入问题类:

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

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

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


P
Poli

在 linux 服务器中尝试 dos2unix script_name

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

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


M
Michał Zawadzki

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


G
Ghoti

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


s
sina72

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

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

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


R
Rocketq

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


T
Toivo Säwén

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


F
Fakrudeen

就我而言,我包含了 package.egg 文件夹的路径,而不是下面的实际包。我将包复制到顶层并且它有效。


S
Scott

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

from site-packages.toolkit.interface import interface

希望它对你也有用!