561

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. 有任何想法吗?会不会是权限问题?我需要一些执行权限吗?

4

33 回答 33

310

根据您对 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在适当的目录中创建并且一切正常......?
于 2008-12-04T00:17:40.203 回答
86

(local directory)/site-packages/toolkit

__init__.py吗?

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

于 2008-12-03T21:50:15.477 回答
79

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

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

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

  2. 当您在tookit目录中时,在命令行中输入这行代码:

    export PYTHONPATH=.

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

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

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

于 2014-04-22T03:52:48.153 回答
42

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

 .:/usr/local/lib/python

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

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

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.
于 2011-03-04T21:14:56.640 回答
33

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

我遇到了类似的问题,除了我的程序在使用 PyCharm 运行时运行良好,但是当我从终端运行时出现上述错误。进一步挖掘后,我发现PYTHONPATH没有项目目录的条目。因此,我设置PYTHONPATH的每个Import 语句都适用于 PyCharm,但不适用于终端

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

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

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

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

于 2019-02-08T16:57:17.503 回答
25

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

于 2019-08-22T16:02:29.053 回答
24

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

于 2017-01-04T17:53:35.573 回答
23

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

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

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

于 2008-12-04T01:11:08.473 回答
20

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

于 2017-09-18T15:30:28.033 回答
18

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

于 2008-12-03T21:31:53.267 回答
7

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

尝试

try:
    from namespace import something 
except NameError:
    from .namespace import something
于 2019-05-11T19:34:13.363 回答
6

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

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

于 2009-01-07T14:22:01.090 回答
5
  1. 您必须将文件 __ init__.py 放在与您要导入的文件相同的目录中。
  2. 您不能尝试从 PYTHONPATH 上配置的 2 个文件夹中导入具有相同名称的文件。

例如:/etc/环境

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

/opt/folder1/foo

/opt/folder2/foo

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

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

于 2014-01-09T19:45:22.150 回答
5

我的两分钱:

在此处输入图像描述

吐:

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/oblivion.py 和 game/oblivion 混淆了 python,它吐出了相当无用的“没有名为 RecordGroups 的模块”。我对记录此(同名)行为的解决方法和/或链接感兴趣-> EDIT(2017.01.24)-看看如果我有一个模块和一个同名的包怎么办?有趣的是,通常优先,但显然我们的启动器违反了这一点。

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

于 2014-09-06T11:17:22.883 回答
4

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

于 2016-07-21T18:51:03.467 回答
4

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

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

如果不是,请重命名foo或使用绝对导入

于 2017-05-02T06:41:36.897 回答
4

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

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

设置对话框

享受。

于 2019-02-18T03:35:13.410 回答
3

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

于 2013-09-04T02:52:25.287 回答
3

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

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

sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so
于 2014-05-30T22:50:26.000 回答
3

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

于 2018-03-27T12:41:07.173 回答
0

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

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

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

于 2014-08-08T08:36:19.993 回答
0

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

于 2015-12-05T07:21:41.063 回答
0

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

于 2016-12-13T11:45:14.073 回答
0

我有同样的问题(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 的回答非常好,而且这个线程几乎有任何可能导致这个问题的东西。所以,这是另一件事,我希望这可能对其他人有所帮助。

于 2018-05-27T23:49:12.480 回答
0

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

于 2018-06-29T22:57:55.227 回答
0

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

from site-packages.toolkit.interface import interface

希望它对你也有用!

于 2019-03-13T12:30:30.863 回答
0

在linux服务器尝试dos2unix script_name

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

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

于 2020-01-17T15:07:56.060 回答
0

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

于 2020-03-10T09:55:12.267 回答
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 文档

于 2020-10-17T11:36:59.883 回答
0

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

于 2021-02-17T18:47:38.750 回答
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 

这解决了它。

于 2021-04-12T06:59:22.727 回答
0

在 ubuntuapt-get安装程序中,python3 版本的包通常命名为

python3-XYZ

和 python2 版本

python-XYZ

根据经验,请尝试错误消息python3-XYZpython-XYZ提到的包。请注意,apt-get依赖包有时也需要这个技巧,或者取而代之。

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

sudo apt-get install python-flask

因此,尝试:

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

或检查提到的依赖项。

于 2021-12-10T23:14:53.160 回答
0

如答案中所述,使用 sys.path.append 对我有用。起初我认为它不起作用,直到我意识到我在目录路径之前有一个空格。因此,请确保您在路径之前没有拼写错误或空格

于 2022-02-23T16:45:19.607 回答