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 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 帖子的评论,我猜测发生了以下情况:
您
__init__.py
在 Windows 上进行了编辑。Windows 编辑器添加了一些非打印内容,可能是回车符(Windows 中的行尾是 CR/LF;在 unix 中仅为 LF),或者可能是 CTRL-Z(Windows 文件结束符)。
您使用 WinSCP 将文件复制到您的 unix 框。
WinSCP 认为:“这里面有一些不是基本文本的东西;我会加上 .bin 扩展名来表示二进制数据。”
缺失的
__init__.py
(现在称为__init__.py.bin
)意味着 python 不理解工具包作为一个包。__init__.py
您在适当的目录中创建并且一切正常......?
解决方案 2:
当我在 LPTHW 中做这个练习时,我遇到了非常类似的事情;我无法让 Python 识别出我调用的目录中有文件。但我最终让它工作了。我所做的和我推荐的是尝试这个:
(注意:从您的初始帖子来看,我假设您正在使用基于 *NIX 的机器并从命令行运行程序,因此此建议是针对这种情况量身定制的。由于我运行的是 Ubuntu,所以我就是这么做的)
将目录 (cd) 更改为文件所在目录的上
mountain.py
一级目录。在本例中,您尝试运行文件并调用模块toolkit.interface.py
,它们位于不同的目录中。在本例中,您将转到包含这两个文件路径的目录(或者换句话说,这两个文件路径共享的最近的目录)。在本例中,即目录toolkit
。当您进入
toolkit
目录时,在命令行中输入以下代码行:
export PYTHONPATH=.
这会将您的 PYTHONPATH 设置为“。”,这基本上意味着您的 PYTHONPATH 现在将在您当前所在的目录中查找任何调用的文件(更重要的是,在您所在目录的子目录分支中。因此,它不仅在您当前的目录中查找,还在您当前目录中的所有目录中查找)。
在上述步骤中设置 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:
您必须将文件 __ init__.py 与要导入的文件放在同一目录中。
您不能尝试导入具有相同名称的文件,并且该文件是来自 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:
我遇到了同样的错误。这是因为有人在与我的脚本相同的文件夹中创建了一个文件夹,而该文件夹的名称与我从其他地方导入的模块冲突。它没有导入外部模块,而是查看了这个文件夹,而这个文件夹显然不包含预期的模块。