【问题标题】:Python error "ImportError: No module named"Python 错误“ImportError:未命名模块”
【发布时间】:2010-09-25 05:22:05
【问题描述】:

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”,让 PyC​​harm 知道这是一个包。
  • 我的问题是新安装的模块的权限不是755。这是因为机器上的umask0027,因此others 没有read 权限导致模块无法读取。添加read 权限解决了我的问题。安装后需要检查目标目录的权限。
  • 这就是 Python 垃圾的原因。 537 次投票,42 个答案,查看了 190 万次 - 这里有些烂。

标签: python importerror python-import


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在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]
    

    或检查提到的依赖项。

    【讨论】:

      【解决方案3】:

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

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

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

      2. 当你在tookit目录下,在你的命令行输入这行代码:

        export PYTHONPATH=.

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

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

      希望这会有所帮助。我自己对此感到非常沮丧。

      【讨论】:

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

      我也有类似的问题。我创建了一个名为 python3.6 的新虚拟环境。

      conda create -n python3.6 python=3.6
      pip install pandas
      

      一切正常,但是当我运行脚本时发生错误

      ModuleNotFoundError: No module named 'pandas'
      

      我发现pip的Python包和缓存的元数据已经更新了,但实际上并没有下载pandas包。 所以我尝试通过pip重新安装,

      pip uninstall pandas --no-cache-dir
      pip install pandas 
      

      这样就解决了。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

              在linux服务器上试试dos2unix script_name

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

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

              【讨论】:

                【解决方案9】:

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

                【讨论】:

                • 谢谢!如果您在默认安装了 Python2 (OS X) 的系统上运行,认为这是一个常见错误
                【解决方案10】:

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

                试试

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

                【讨论】:

                • 第一个是python 2语法,第二个是python 3。
                【解决方案11】:

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

                我遇到了类似的问题,除了我的程序在使用 PyCharm 运行时运行良好,但在我从终端运行时出现上述错误。进一步挖掘后,我发现PYTHONPATH 没有项目目录的条目。所以,我将PYTHONPATH 设置为Import statement works on PyCharm but not from terminal

                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())
                【解决方案12】:

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

                from site-packages.toolkit.interface import interface
                

                希望它对你也有用!

                【讨论】:

                  【解决方案13】:

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

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

                  享受吧。

                  【讨论】:

                    【解决方案14】:

                    在我的例子中,我包含了 package.egg 文件夹的路径,而不是下面的实际包。我将包复制到顶层并且它起作用了。

                    【讨论】:

                      【解决方案15】:

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

                      【讨论】:

                        【解决方案16】:

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

                        【讨论】:

                          【解决方案17】:

                          一个简单的解决方案是使用python -m pip install &lt;library-name&gt; 而不是pip install &lt;library-name&gt; 安装模块 如果有管理员限制,您可以使用 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须藤)。无论如何,这没有任何意义。
                          【解决方案18】:

                          如果您尝试了上面提供的所有方法但都失败了,那么您的模块可能与内置模块有同名。或者,具有同名的模块存在于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
                          【解决方案19】:

                          我的两分钱:

                          吐:

                          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 的模块”。我对记录此(同名)行为的解决方法和/或链接感兴趣-> 编辑(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”,但可能需要检查一下
                          【解决方案20】:

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

                          【讨论】:

                            【解决方案21】:

                            在 *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 添加到启动脚本来修复它。
                            【解决方案22】:

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

                            该文件需要准确地调用__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 身份安装了一个包,它更改了权限,因此其他用户没有他们以前的访问权限。
                            【解决方案23】:

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

                            【讨论】:

                            • 谢谢,这绝对是继承遗留项目的必要条件,所有模块都位于 /src 目录之外的平面层次结构中
                            【解决方案24】:

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

                            【讨论】:

                              【解决方案25】:

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

                              【讨论】:

                                【解决方案26】:

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

                                【讨论】:

                                  【解决方案27】:

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

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

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

                                  【讨论】:

                                    【解决方案28】:

                                    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
                                    

                                    【讨论】:

                                      【解决方案29】:
                                      1. 您必须将文件 __ init__.py 放在与您要导入的文件相同的目录中。
                                      2. 您不能尝试从 PYTHONPATH 上配置的 2 个文件夹中导入同名文件。

                                      例如: /etc/环境

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

                                      /opt/folder1/foo

                                      /opt/folder2/foo

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

                                      from foo import ... >>> importerror: no module named foo

                                      【讨论】:

                                        【解决方案30】:

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

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

                                        【讨论】:

                                          猜你喜欢
                                          • 1970-01-01
                                          • 2019-12-12
                                          • 2011-11-27
                                          • 1970-01-01
                                          • 2020-08-11
                                          • 1970-01-01
                                          • 2016-01-16
                                          • 1970-01-01
                                          相关资源
                                          最近更新 更多