尝试运行 Python 脚本时出现“ImportError:未命名模块”
- 2025-02-27 09:07:00
- admin 原创
- 59
问题描述:
我正在尝试运行一个脚本,该脚本除其他内容外还启动一个 python 脚本。我得到了一个ImportError: No module named ...
,但是,如果我启动 ipython 并以相同的方式通过解释器导入相同的模块,则该模块会被接受。
发生了什么事,我该如何解决?我试图了解 python 如何使用 PYTHONPATH,但我完全糊涂了。任何帮助都将不胜感激。
解决方案 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进行了详细讨论。
解决方案 2:
__init__.py
在运行 Python 项目时,只需在显示错误的文件夹下创建一个同名的空 Python 文件。
解决方案 3:
确保它们都使用相同的解释器。我在 Ubuntu 上遇到过这种情况:
$ ipython3 -c 'import sys; print(sys.version)'
3.4.2 (default, Jun 19 2015, 11:34:49)
[GCC 4.9.1]
$ python3 -c 'import sys; print(sys.version)'
3.3.0 (default, Nov 27 2012, 12:11:06)
[GCC 4.6.3]
sys.path
两个解释器之间存在差异。为了解决这个问题,我删除了 Python 3.3 。
解决方案 4:
主要原因是Python和IPython的sys.paths不同。
请参考lucypark 链接,该解决方案适用于我的情况。当通过以下方式安装 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 shell 中:
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")'
]
完毕
解决方案 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:
我发现这个问题的解决方案在这里已有详细记录:
https://jakevdp.github.io/blog/2017/12/05/installing-python-packages-from-jupyter/
基本上,您必须在 Jupyter 环境中安装软件包,并发出如下 shell 命令:
!{sys.executable} -m pip install numpy
请查看上面的链接以获得权威的完整答案。
解决方案 8:
在安装 ipython 之前,我通过 easy_install; say 安装了模块sudo easy_install mechanize
。
安装 ipython 后,我必须重新运行 easy_install 以便 ipython 识别模块。
解决方案 9:
如果您从命令行运行它,有时 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)
我不确定这是否是解决问题的好方法,但它确实对我有用。
解决方案 10:
这种错误很可能是由于 Python 版本冲突而发生的。例如,如果您的应用程序只能在 Python 3 上运行,而您也有 Python 2,那么最好指定要使用的版本。例如使用
python3 .....
而不是
python
解决方案 11:
如果符合以下条件,则此答案适用于此问题
你不想更改你的代码
您不想永久更改 PYTHONPATH
临时修改PYTHONPATH
下面的路径可以是相对的
PYTHONPATH=/path/to/dir python script.py
解决方案 12:
遇到了类似的问题,通过调用python3
而不是来修复它python
,我的模块在Python3.5中。
解决方案 13:
发生在我目录上utils
。我试图将该目录导入为:
from utils import somefile
utils
已经是 Python 中的一个包。只需将目录名称更改为其他名称,它就可以正常工作。
解决方案 14:
出现此问题是由于版本不同造成的 - 例如,如果您机器上安装的 Python 安装在名为的文件夹中,path_to_lib/python3.6
但您的笔记本正在其中运行Python 3
- 命名中的间距很重要!
如何解决?
创建新的 jupyter 笔记本时,只需选择与您的版本相同的 Python(注意空格!)。请参阅附图。
解决方案 15:
发生这种情况的一个非常微妙的方式是当您的文件名与 anaconda 环境名称相同时。我遇到过这种情况,因为两个不同的文件中的代码完全相同,其中一个文件被意外命名为 anaconda 环境,引发了“未找到模块错误”。
解决方案 16:
我发现了这种差异的另一个根源:
我在本地和虚拟环境中都安装了 ipython。我的问题是,在一个新创建的带有 ipython 的虚拟环境中,系统 ipython 被选中,而它的版本与虚拟环境中的 python 和 ipython 不同(2.7.x 与 3.5.x),然后发生了有趣的事情。
我认为,无论何时安装包含二进制文件的东西,最明智的做法yourvirtualenv/bin
是立即运行rehash
或类似使用的任何 shell,以便获取正确的 python/ipython。(必须检查是否有合适的pip
安装后挂钩......)
解决方案 17:
无需脚本的解决方案:
打开 Spyder -> 工具 -> PYTHONPATH 管理器
点击“添加路径”添加 Python 路径。例如:'C:\Users\User\AppData\Local\Programs\Python\Python37\Lib\site-packages'
单击“同步...”以允许其他程序(例如 Jupyter Notebook)使用步骤 2 中设置的 pythonpaths。
如果 Jupyter 已打开,请重新启动它
解决方案 18:
这可能是由于您的系统上安装了不同的 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
解决方案 19:
import sys
sys.path.append('/Users/{user}/Library/Python/3.7/lib/python/site-packages')
import ta
解决方案 20:
如果有人在 MSVS Code 中使用 Jupyter Notebook 时遇到此问题conda
,解决方案是确保使用正确的内核。内核位于界面右上角的一个框中,如下所示:
我指向了与我的应用程序路径匹配的 Python 版本——问题解决了!
解决方案 21:
这对我有用:我只是改变了笔记本里的工作目录
import os
os.chdir("my/path/to/module")
os.getcwd()
解决方案 22:
我在设置 Jupyter Lab 时遇到了类似的问题,我通过打开时检查 Jupyter Lab 日志解决了这个问题。它告诉我虚拟环境 (pipenv) 无法找到 Jupyter Lab,因此它使用了共享版本(来自早期安装的 Python)。
我创建了一个 requirements.txt 文件,发现我还没有在这个新环境中安装 Jupyter Lab。安装它可以解决导入错误。
解决方案 23:
删除pathlib
并重新安装。删除文件夹中的 pathlib sitepackages
,然后使用 pip 命令重新安装 pathlib 包:
pip install pathlib
扫码咨询,免费领取项目管理大礼包!