无法在Jupyter Notebook中导入PyOpenCL

7

我正在Anaconda环境中运行,已经安装了pyopencl:

$> conda list | grep pyopencl
pyopencl                  2018.2.5         py37h9888f84_0    conda-forge

我从同一个窗口启动:

$> anaconda3/bin/jupyter_mac.command

翻译内容如下:

cat /Anaconda3/bin/jupyter_mac.command

DIR=$(dirname $0)

$DIR/jupyter-notebook

现在我们正在运行一个笔记本。当我尝试导入pyopencl时:

import pyopencl as cl

我遇到了以下错误:

ModuleNotFoundError: No module named 'pyopencl'

我能够通过以下方式在同一shell中本地运行示例而不出现任何错误:

$> python test6.py
Choose platform:
[0] <pyopencl.Platform 'Portable Computing Language' at 0x11512cf00>
[1] <pyopencl.Platform 'Apple' at 0x7f984cd1e010>
Choice [0]:1
Choose device(s):
[0] <pyopencl.Device 'Intel(R) Core(TM) i7-8850H CPU @ 2.60GHz' on 'Apple' at 0x7f984cc1f090>
[1] <pyopencl.Device 'Intel(R) UHD Graphics 630' on 'Apple' at 0x7f984cc19370>
[2] <pyopencl.Device 'AMD Radeon Pro 560X Compute Engine' on 'Apple' at 0x7f984cc19390>
Choice, comma-separated [0]:2
Set the environment variable PYOPENCL_CTX='1:2' to avoid being asked again.
PASSED
[-0.13433748]
[-0.13433748]

感谢您的任何帮助!谢谢。


我建议您在Jupyter笔记本中输入“print(sys.path)”,并检查您要导入的模块是否确实存在于sys.path识别的文件夹之一中。当然,您需要先执行“import sys”。 - RebornCodeLover
在您的环境中,请尝试执行“conda install pyopencl”。 - RebornCodeLover
是的,我已经尝试过了。没有效果。 - mr-sk
你尝试从Anaconda提示符中运行jupyter_mac.command了吗? - CristiFati
抱歉,我错过了第一行 :). 当您尝试在浏览器中(在笔记本中)执行与控制台中运行的相同代码时,错误发生在您启动jupyter-notebookAnaconda控制台中,对吗?此外,我假设您安装pyopenclAnaconda环境与默认(base)不同。如果上述假设是正确的,那么它是使用默认的Anaconda Python还是其他版本创建的?您能否在导入后在控制台中(在其工作的地方)打印print(cl)并粘贴输出? - CristiFati
显示剩余2条评论
3个回答

2

背景

我成功地复现了这种行为:

  • Win上 - 但这不应该是一个问题,因为(我假设)在OSX上情况是相同的
  • (当前)Anaconda环境下的PythonAnaconda默认环境下的Python是不同的。如果不是这种情况,答案(或部分答案)可能是不正确的。请注意,这是我要引用的唯一两个Python,它们都是Anaconda内部的(即使Anaconda“关键字”不会出现)
  • 我在我的测试场景中使用了PyGraphviz(而不是PyOpenCL

code0.py:

#!/usr/bin/env python3

import sys
import os
import pprint


print(f"Python Executable: {sys.executable}")
print(f"Version {sys.version} on {sys.platform}\n")

conda_env_var = "CONDA_DEFAULT_ENV"
conda_env = os.environ[conda_env_var]
print(f"{conda_env_var}: {conda_env}\n")

sys_path = pprint.pformat(sys.path)
print(f"sys.path: {sys_path}\n")

path_var = "PATH"
env_path = pprint.pformat([item for item in os.environ[path_var].split(os.pathsep) if item.find(conda_env) > -1])
print(f"os.environ[\"{path_var}\"] (relevant): {env_path}\n")

import pygraphviz
print(pygraphviz)

Output:

(py_064_030701_test0) [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055251357]> python code0.py
Python Executable: E:\Install\x64\Anaconda\Anaconda\2018.12\envs\py_064_030701_test0\python.exe
Version 3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)] on win32

CONDA_DEFAULT_ENV: py_064_030701_test0

sys.path: ['e:\\Work\\Dev\\StackOverflow\\q055251357',
 'E:\\Work\\Dev\\Utils',
 'E:\\Install\\x64\\Anaconda\\Anaconda\\2018.12\\envs\\py_064_030701_test0\\python37.zip',
 'E:\\Install\\x64\\Anaconda\\Anaconda\\2018.12\\envs\\py_064_030701_test0\\DLLs',
 'E:\\Install\\x64\\Anaconda\\Anaconda\\2018.12\\envs\\py_064_030701_test0\\lib',
 'E:\\Install\\x64\\Anaconda\\Anaconda\\2018.12\\envs\\py_064_030701_test0',
 'E:\\Install\\x64\\Anaconda\\Anaconda\\2018.12\\envs\\py_064_030701_test0\\lib\\site-packages']

os.environ["PATH"] (relevant): ['E:\\Install\\x64\\Anaconda\\Anaconda\\2018.12\\envs\\py_064_030701_test0',
 'E:\\Install\\x64\\Anaconda\\Anaconda\\2018.12\\envs\\py_064_030701_test0\\Library\\mingw-w64\\bin',
 'E:\\Install\\x64\\Anaconda\\Anaconda\\2018.12\\envs\\py_064_030701_test0\\Library\\usr\\bin',
 'E:\\Install\\x64\\Anaconda\\Anaconda\\2018.12\\envs\\py_064_030701_test0\\Library\\bin',
 'E:\\Install\\x64\\Anaconda\\Anaconda\\2018.12\\envs\\py_064_030701_test0\\Scripts',
 'E:\\Install\\x64\\Anaconda\\Anaconda\\2018.12\\envs\\py_064_030701_test0\\bin']

<module 'pygraphviz' from 'E:\\Install\\x64\\Anaconda\\Anaconda\\2018.12\\envs\\py_064_030701_test0\\lib\\site-packages\\pygraphviz\\__init__.py'>


(py_064_030701_test0) [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055251357]> where jupyter-notebook
E:\Install\x64\Anaconda\Anaconda\2018.12\Scripts\jupyter-notebook.exe

(py_064_030701_test0) [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055251357]> jupyter-notebook
[I 01:16:10.345 NotebookApp] JupyterLab extension loaded from E:\Install\x64\Anaconda\Anaconda\2018.12\lib\site-packages\jupyterlab
[I 01:16:10.346 NotebookApp] JupyterLab application directory is E:\Install\x64\Anaconda\Anaconda\2018.12\share\jupyter\lab
[I 01:16:10.349 NotebookApp] Serving notebooks from local directory: e:\Work\Dev\StackOverflow\q055251357
[I 01:16:10.350 NotebookApp] The Jupyter Notebook is running at:
[I 01:16:10.352 NotebookApp] http://localhost:8888/?token=14412a6d6d0c895d059a86bcd71e10cbface4a479c5843c2
[I 01:16:10.353 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 01:16:10.437 NotebookApp]

    To access the notebook, open this file in a browser:
        file:///C:/Users/cfati/AppData/Roaming/jupyter/runtime/nbserver-24700-open.html
    Or copy and paste one of these URLs:
        http://localhost:8888/?token=14412a6d6d0c895d059a86bcd71e10cbface4a479c5843c2
[I 01:17:18.569 NotebookApp] 302 GET /?token=14412a6d6d0c895d059a86bcd71e10cbface4a479c5843c2 (::1) 0.98ms
[I 01:17:25.161 NotebookApp] Creating new notebook in
[I 01:17:26.147 NotebookApp] Kernel started: 8b702b2d-97d0-40e3-bbca-42107efd1de5
[I 01:17:27.186 NotebookApp] Adapting to protocol v5.1 for kernel 8b702b2d-97d0-40e3-bbca-42107efd1de5
同样的脚本也在 Jupyter Notebook 中运行:

Img0

如所见,它失败了,这是因为它是由Anaconda的默认Python运行的(该软件包未安装)。看了一下发现,jupyter-notebook可执行文件启动了(Anaconda的默认)Python在同一目录下的jupyter-notebook-script.py上。
可能的解决方案:

1. 在主要的Python中安装缺失的软件包

这是我首先想到的:安装PyGraphviz(和所有其他所需的软件包)。 没有尝试过,但应该可以工作。我之所以没有尝试,是因为我反对用软件包污染主要的Python。但是,由于它已经包含了大量的site-packages,事情是值得商榷的。

2. 注册当前环境Python为内核

我试图让 jupyter-notebook 使用当前环境的 Python 安装,使用它的配置或修改 %CONDA_PYTHON_EXE%,但没有成功(请注意这是我第一次使用 Jupyter)。无论如何,在进行一些调查后,我意识到jupyter-notebook可执行文件启动了安装在其中的 Jupyter 的 Python。这是一种常见的技术,通过将 Python 路径硬编码到可执行文件中来实现(尽管奇怪的是,用十六进制编辑器查看时找不到它)。
在搜索过程中,我发现 [SO]: Changing Python Executable (@Matt's answer),然后跳转到[ReadTheDocs.IPython]: Installing the IPython kernel并尝试了一下。
py_064_030701_test0) [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055251357]> where pip
E:\Install\x64\Anaconda\Anaconda\2018.12\envs\py_064_030701_test0\Scripts\pip.exe
E:\Install\x64\Anaconda\Anaconda\2018.12\Scripts\pip.exe

(py_064_030701_test0) [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055251357]> pip freeze
certifi==2019.3.9
pygraphviz==1.5
wincertstore==0.2

(py_064_030701_test0) [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055251357]> pip install ipykernel
Collecting ipykernel

...
# Some pip useless output
...

Installing collected packages: tornado, colorama, six, ipython-genutils, decorator, traitlets, backcall, pygments, pickleshare, wcwidth, prompt-toolkit, parso, jedi, ipython, jupyter-core, python-dateutil, pyzmq, jupyter-client, ipykernel
Successfully installed backcall-0.1.0 colorama-0.4.1 decorator-4.4.0 ipykernel-5.1.0 ipython-7.4.0 ipython-genutils-0.2.0 jedi-0.13.3 jupyter-client-5.2.4 jupyter-core-4.4.0 parso-0.3.4 pickleshare-0.7.5 prompt-toolkit-2.0.9 pygments-2.3.1 python-dateutil-2.8.0 pyzmq-18.0.1 six-1.12.0 tornado-6.0.2 traitlets-4.3.2 wcwidth-0.1.7

(py_064_030701_test0) [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055251357]> where python
E:\Install\x64\Anaconda\Anaconda\2018.12\envs\py_064_030701_test0\python.exe
E:\Install\x64\Anaconda\Anaconda\2018.12\python.exe

(py_064_030701_test0) [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055251357]> python -m ipykernel install --name %CONDA_DEFAULT_ENV%
Installed kernelspec py_064_030701_test0 in C:\ProgramData\jupyter\kernels\py_064_030701_test0
启动后,选择新创建的内核(如下图所示),一切都很顺利。

Img1

这基本上就是@AndrásNagy在他的答案中解释的内容。
虽然这是我一开始的首选,但使用当前环境下的Python将其元数据编写到一个位置,以便主要的Python (以及其他不一定在Anaconda内的Python)可以从中读取,对我来说似乎并不那么直接(尽管这可能是推荐的方法)。
3. 在当前环境的Python中安装Jupyter 我一开始也考虑了这个方法,但由于之前的方法,我没有立即开始。我认为Jupyter有很多依赖项(这是真的),但IPyKernel也有很多依赖项。然而,现在我认为这是最简单的方法。
(py_064_030701_test0) [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055251357]> pip install jupyter
Collecting jupyter

...
# Some pip useless output
...

Installing collected packages: qtconsole, testpath, defusedxml, entrypoints, webencodings, bleach, mistune, MarkupSafe, jinja2, pandocfilters, attrs, pyrsistent, jsonschema, nbformat, nbconvert, Send2Trash, prometheus-client, pywinpty, terminado, notebook, widgetsnbextension, ipywidgets, jupyter-console, jupyter
Successfully installed MarkupSafe-1.1.1 Send2Trash-1.5.0 attrs-19.1.0 bleach-3.1.0 defusedxml-0.5.0 entrypoints-0.3 ipywidgets-7.4.2 jinja2-2.10 jsonschema-3.0.1 jupyter-1.0.0 jupyter-console-6.0.0 mistune-0.8.4 nbconvert-5.4.1 nbformat-4.4.0 notebook-5.7.8 pandocfilters-1.4.2 prometheus-client-0.6.0 pyrsistent-0.14.11 pywinpty-0.5.5 qtconsole-4.4.3 terminado-0.8.2 testpath-0.4.2 webencodings-0.5.1 widgetsnbextension-3.4.2


(py_064_030701_test0) [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055251357]> where jupyter-notebook
E:\Install\x64\Anaconda\Anaconda\2018.12\envs\py_064_030701_test0\Scripts\jupyter-notebook.exe
E:\Install\x64\Anaconda\Anaconda\2018.12\Scripts\jupyter-notebook.exe
毋庸置疑,启动 jupyter-notebook注意它是不同的可执行文件)就解决了问题(因为安装 Jupyter 也将 Python 安装作为一个内核注册了)。

0

我曾经遇到过类似的问题,我创建了一个conda环境,激活该环境,安装了一堆包,然后将内核添加到ipython中,但是安装的包无法加载,我一直收到导入错误的提示。

解决方案: 新内核指向了错误的python可执行文件(基础环境),我必须编辑kernel.json文件,将其指向适当环境中的python可执行文件。这是“argv”数组中的第一个字符串。


0

我认为我和你遇到了同样的问题! 当我从我的conda环境启动jupyter笔记本时,anaconda环境内核没有显示在我的jupyter笔记本中。

请考虑以下事项:

conda activate YourEnvironmentName
pip install ipykernel 
python -m ipykernel install --user --name=YourEnvironmentName

希望在完成本次任务后,您将能够启动您的Jupyter笔记本。
jupyter notebook --ip=0.0.0.0 --port=8080

从已安装pyopencl的内核列表中选择conda环境


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接