尝试运行 Python 脚本时出现“ImportError: No module named”

Posted

技术标签:

【中文标题】尝试运行 Python 脚本时出现“ImportError: No module named”【英文标题】:"ImportError: No module named" when trying to run Python script 【发布时间】:2013-03-09 00:27:12 【问题描述】:

我正在尝试运行一个脚本来启动一个 python 脚本等。我得到一个 ImportError: No module named ...,但是,如果我启动 ipython 并通过解释器以相同的方式导入相同的模块,则该模块被接受。

发生了什么,我该如何解决?我试图了解 python 如何使用 PYTHONPATH,但我非常困惑。任何帮助将不胜感激。

【问题讨论】:

您需要提供更多信息。当您说“运行脚本”时,您的意思是 shell 脚本吗?您无法导入的模块是什么?该模块位于何处?你的脚本在哪里? 如果您想对“发生了什么”有明确的答案,请使用 -v 选项启动 python,您将看到 python 在哪里(或不在哪里)找到您导入的模块。 您要导入什么?两个python脚本是不是在同一个目录? 请向我们提供您正在运行的代码、堆栈跟踪的全文以及您为产生错误所采取的确切步骤。当我们不知道确切的问题是什么时,很难提供帮助。 我猜这是很多用户都会遇到的问题,即使是在第一次提出问题 4 年后。 【参考方案1】:

这个问题的出现是由于命令行 IPython 解释器使用您当前路径的方式与单独进程的方式不同(无论是 IPython 笔记本、外部进程等)。 IPython 将寻找不仅可以在您的 sys.path 中找到的要导入的模块,而且还可以在您当前的工作目录中找到。从命令行启动解释器时,您正在操作的当前目录与您启动 ipython 的目录相同。如果您运行

import os
os.getcwd() 

你会发现这是真的。

但是,假设您使用的是 ipython 笔记本,运行 os.getcwd(),而您当前的工作目录是您在 ipython_notebook_config.py 文件中告诉笔记本进行操作的文件夹(通常使用 c.NotebookManager.notebook_dir设置)。

解决方案是为 python 解释器提供你的模块路径。最简单的解决方案是将该路径附加到您的 sys.path 列表中。在你的笔记本中,首先尝试:

import sys
sys.path.append('my/path/to/module/folder')

import module_of_interest

如果这不起作用,则说明您遇到了与导入路径无关的不同问题,您应该提供有关您的问题的更多信息。

解决这个问题的更好(和更持久)的方法是设置您的 PYTHONPATH,它为解释器提供了额外的目录来查找 python 包/模块。将 PYTHONPATH 编辑或设置为全局变量取决于操作系统,此处针对Unix 或Windows 进行了详细讨论。

【讨论】:

PSA:如果您遇到这个 SO 问题是因为您在 jupyter-notebook 中遇到此错误,请参见下文,***.com/a/27944947/127971 不幸的是,这个问题对于单个答案来说不够具体. @michael 答案是关于在一般情况下导入 Python 模块;当解释器在目录中搜索要导入的模块时,需要 dunder init.py 文件,无论是否是笔记本。以上关于笔记本解释器工作目录和设置 PYTHONPATH 的回答是正确的。 我确实说过,由于问题的措辞,会有多个正确答案。我并不是在暗示这个答案是正确的。但是,如果使用 jupyter-notebook,您只需触摸文件__init_.py,对吗? ...并且,不会想要修改PYTHONPATH 也不会调用sys.path.append,即使它们也是正确的(正确?)。我的意思是,我有几十个目录,其中包含代码,我不会将它们全部添加到路径中——或者期望其他用户添加到他们的 jupyter 配置文件中,即使它是一个目录。 这对我很有帮助。特别是因为 init.py 位于正确的文件夹中,并且在本地工作但在 jupyter 中没有......【参考方案2】:

运行python项目时,只需在显示错误的文件夹下创建一个名为__init__.py的空python文件。

【讨论】:

init.py”是指“_init_.py”,对吗?我将 _init_.py 创建为一个空文件,它对我有用。非常感谢。但为什么需要这个?在我与 ipython 笔记本在同一目录中有一个 python 脚本并且导入工作正常之前。 其实 init.py 是用来表示python的,表示对应的位置有一些包。那么只有它会找到您在它下创建的任何子模块。如果你不创建 'init.py' 意味着 python 不知道里面有一些包。例如: from "Myfolder.Mypackage import Mymodules" 例如,您应该启动 init.py 以指示 python 告诉这里有一些包。否则它不知道。 是的,完美的答案。这在 python 2.7 中是必需的,但请注意 3 这为我解决了 python 3 中的问题。 也为我解决了这个问题——使用 jupyter notebook,python 源代码位于 ipynb 文件的子目录中;例如,foo.ipynb 使用bar/baz.py,添加空的bar/__init__.py 文件以便笔记本可以使用from bar.baz import MyClass【参考方案3】:

确保他们都使用相同的解释器。这在 Ubuntu 上发生在我身上:

$ ipython3 -c 'import sys; print(sys.version)'
3.4.2 (default, Jun 19 2015, 11:34:49) \n[GCC 4.9.1]

$ python3 -c 'import sys; print(sys.version)'
3.3.0 (default, Nov 27 2012, 12:11:06) \n[GCC 4.6.3]

sys.path 在两个解释器之间是不同的。为了修复它,我删除了 Python 3.3。

【讨论】:

使用 miniconda 安装了一堆与 python 相关的东西,我也遇到了这个问题。捆绑的 ubuntu python 2.7 与 miniconda python 2.7 不同。这个答案让我能够解决问题 这是我的问题。我已升级到 python 2.7.11,但我的 iPython 交互式 shell 仍在使用 2.7.5。我只需要运行pip install --upgrade ipython 来获取最新版本,然后默认自动使用2.7.11。 我的 IPython 是 7.4.0,而根本没有这样的 Python 版本。 @aderchox 在 ipython 中运行此命令以获取解释器版本:import sys; sys.version【参考方案4】:

主要原因是Python和IPython的sys.paths不同。

请参考lucypark link,该解决方案适用于我的情况。通过

安装 opencv 时会发生这种情况

conda install opencv

在 iPython 中出现导入错误,解决此问题的三个步骤:

import cv2
ImportError: ...

1.使用以下命令检查 Python 和 iPython 中的路径

import sys
sys.path

您会发现 Python 和 Jupyter 的结果不同。第二步,只需使用sys.path.append 通过试错法修复错过的路径。

2。临时解决方案

在 iPython 中:

import sys
sys.path.append('/home/osboxes/miniconda2/lib/python2.7/site-packages')
import cv2

ImportError:.. 问题已解决

3.永久解决方案

创建一个 iPython 配置文件并设置初始附加:

在 bash 外壳中:

ipython profile create
... CHECK the path prompted , and edit the prompted config file like my case
vi /home/osboxes/.ipython/profile_default/ipython_kernel_config.py

在vi中,追加到文件中:

c.InteractiveShellApp.exec_lines = [
 'import sys; sys.path.append("/home/osboxes/miniconda2/lib/python2.7/site-packages")'
]

完成

【讨论】:

'ipython 配置文件创建' .... 是的!这是解决 jupyter notebook 不从环境 PATH 和 PYTHONPATH 读取的唯一(永久)解决方案......而无需在每个文件(yuk)的开头使用凌乱的 sys.path 语句。谢谢@jesse。 @z0r 的解决方案证实了我的问题,但这里的#3“永久解决方案”为我解决了这个问题。【参考方案5】:

执行sys.path.append('my-path-to-module-folder') 会起作用,但为了避免每次要使用该模块时都必须在 IPython 中执行此操作,您可以将 export PYTHONPATH="my-path-to-module-folder:$PYTHONPATH" 添加到您的 ~/.bash_profile 文件中。

【讨论】:

【参考方案6】:

这就是我修复它的方法:

import os
import sys
module_path = os.path.abspath(os.getcwd() + '\\..')
if module_path not in sys.path:
    sys.path.append(module_path)

【讨论】:

【参考方案7】:

在安装ipython之前,我通过easy_install安装了模块;说sudo easy_install mechanize

安装 ipython 后,我不得不重新运行 easy_install 以便 ipython 识别模块。

【讨论】:

【参考方案8】:

如果您从命令行运行它,有时 python 解释器不知道查找模块的路径。

下面是我项目的目录结构:

/project/apps/..
/project/tests/..

我在下面的命令下运行:

>> cd project

>> python tests/my_test.py

运行以上命令后出现以下错误

no module named lib

lib 是在 my_test.py 中导入的

我打印了 sys.path 并发现我正在处理的项目路径在 sys.path 列表中不可用

我在脚本开头添加了以下代码my_test.py

import sys
import os

module_path = os.path.abspath(os.getcwd())    

if module_path not in sys.path:       

    sys.path.append(module_path)

我不确定这是否是解决问题的好方法,但确实对我有用。

【讨论】:

如果您总是从同一位置运行脚本,这将起作用。否则,你会遇到问题,因为os.getcwd() 获取的是运行脚本的目录,而不是脚本文件所在的目录。【参考方案9】:

我发现此问题的解决方案已在此处广泛记录:

https://jakevdp.github.io/blog/2017/12/05/installing-python-packages-from-jupyter/

基本上,您必须在 Jupyter 环境中安装软件包,发出如下 shell 命令:

!sys.executable -m pip install numpy

请查看以上链接以获得权威的完整答案。

【讨论】:

【参考方案10】:

这种错误很可能是由于python版本冲突引起的。例如,如果您的应用程序仅在Python 3上运行,并且您也有Python 2,那么最好指定要使用的版本。 例如使用

python3 .....

而不是

python

【讨论】:

【参考方案11】:

遇到了类似的问题,通过调用python3 而不是python 解决了这个问题,我的模块在Python3.5 中。

【讨论】:

【参考方案12】:

我发现了这种差异的另一个来源:

我已经在本地和 virtualenvs 中安装了 ipython。我的问题是,在一个新制作的带有 ipython 的 virtualenv 中,系统 ipython 被拾取,它与 virtualenv 中的 python 和 ipython 版本不同(2.7.x 与 3.5.x),并且随之而来的是欢闹。

我认为,每当安装将在yourvirtualenv/bin 中包含二进制文件的东西时,明智的做法是立即为您使用的任何 shell 运行rehash 或类似的东西,以便拾取正确的 python/ipython。 (要检查是否有合适的pip 安装后挂钩...)

【讨论】:

【参考方案13】:

没有脚本的解决方案:

    打开 Spyder -> 工具 -> PYTHONPATH 管理器 通过单击“添加路径”添加 Python 路径。 例如:'C:\Users\User\AppData\Local\Programs\Python\Python37\Lib\site-packages' 单击“同步...”以允许其他程序(例如 Jupyter Notebook)使用在第 2 步中设置的 Python 路径。 如果 Jupyter 已打开,则重新启动它

【讨论】:

【参考方案14】:

这可能是由系统上安装的不同 python 版本引起的,即 python2python3

运行命令 $ pip --version$ pip3 --version 以检查 pip 来自 Python 3x。例如。您应该会看到如下版本信息:

pip 19.0.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)

然后使用以下命令运行example.py 脚本

$ python3 example.py

【讨论】:

【参考方案15】:

目录utils 发生在我身上。我试图将此目录导入为:

from utils import somefile

utils 已经是 python 中的一个包。只需将您的目录名称更改为不同的名称,它应该可以正常工作。

【讨论】:

【参考方案16】:

这个答案适用于这个问题如果

    您不想更改代码 您不想永久更改 PYTHONPATH

Temporarily modify PYTHONPATH

下面的路径可以是相对的

PYTHONPATH=/path/to/dir python script.py

【讨论】:

【参考方案17】:
import sys
sys.path.append('/Users/user/Library/Python/3.7/lib/python/site-packages')
import ta

【讨论】:

【参考方案18】:

如果有人在 MSVS 代码中使用带有 Jupyter Notebook 的 conda 遇到此问题,解决方案是确保您使用的是正确的内核。内核位于界面右上角的一个框中,如下所示:

我指出了与我的应用程序路径相匹配的 Python 版本——问题解决了!

【讨论】:

【参考方案19】:

删除pathlib 并重新安装。删除sitepackages文件夹下的pathlib,使用pip命令重新安装pathlib包:

pip install pathlib

【讨论】:

以上是关于尝试运行 Python 脚本时出现“ImportError: No module named”的主要内容,如果未能解决你的问题,请参考以下文章

尝试运行 python 包时出现“RuntimeError: invalid slot offset”

使用 Pyspark 运行 Python 脚本时出现 py4j.protocol.Py4JJavaError [重复]

尝试运行 ESLint 脚本时出现“SyntaxError: Unexpected token ”

使用来自 python 的 Airflow 触发 SQL 时出现模板错误?

从 shell 脚本运行 python 文件时出现 ModuleNotFoundError 错误

在 VSCode 中运行任何 Python 脚本时出现“&”语法错误?