尝试运行 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 版本引起的,即 python2 或 python3。
运行命令 $ 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 时出现模板错误?