python - 带有多个版本的 python 3(3.6 和 3.7)的 jupyter 选择了错误的站点包
问题描述
我已经在办公桌前敲了 3 天了,我不知道该怎么处理这个问题,所以如果你知道发生了什么,请告诉我。
问题:当我运行一个全局安装的(在虚拟环境之外)jupyter notebook 并注册内核(ipykernel 安装在虚拟环境中),其中虚拟环境的 python3 -V 是 3.6.4,全局 python3 -V 是3.7.0,当我激活 venv 内核时,jupyter 笔记本(从活动 venv 运行)崩溃,因为它试图从全局 python 3.7.0 中获取站点包
[I 11:11:13.221 NotebookApp] Serving notebooks from local directory: /Users/cap/Desktop/Projects/lastresort
[I 11:11:13.221 NotebookApp] 0 active kernels
[I 11:11:13.221 NotebookApp] The Jupyter Notebook is running at:
[I 11:11:13.221 NotebookApp] http://localhost:8888/?token=cc92b513df1e586ce592bfc4fe641b9f2d76fdde480c6f07
[I 11:11:13.221 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 11:11:13.222 NotebookApp]
Copy/paste this URL into your browser when you connect for the first time,
to login with a token:
http://localhost:8888/?token=cc92b513df1e586ce592bfc4fe641b9f2d76fdde480c6f07&token=cc92b513df1e586ce592bfc4fe641b9f2d76fdde480c6f07
[I 11:11:13.438 NotebookApp] Accepting one-time-token-authenticated connection from ::1
[I 11:11:16.385 NotebookApp] Kernel started: 2ad09f31-36f6-48cf-b859-7f78fdb6adb8
[I 11:11:17.014 NotebookApp] Adapting to protocol v5.1 for kernel 2ad09f31-36f6-48cf-b859-7f78fdb6adb8
[I 11:11:19.398 NotebookApp] Starting buffering for 2ad09f31-36f6-48cf-b859-7f78fdb6adb8:cda1e6c165f3482482d80df7d2664e9b
[I 11:11:19.609 NotebookApp] Kernel shutdown: 2ad09f31-36f6-48cf-b859-7f78fdb6adb8
[I 11:11:19.630 NotebookApp] Kernel started: 9b90f202-97bf-43b1-ba50-64d6a1323405
Traceback (most recent call last):
File "/Users/cap/.pyenv/versions/3.6.4/lib/python3.6/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/Users/cap/.pyenv/versions/3.6.4/lib/python3.6/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/usr/local/Cellar/jupyter/1.0.0_5/libexec/lib/python3.7/site-packages/ipykernel_launcher.py", line 15, in <module>
from ipykernel import kernelapp as app
File "/usr/local/Cellar/jupyter/1.0.0_5/libexec/lib/python3.7/site-packages/ipykernel/__init__.py", line 2, in <module>
from .connect import *
File "/usr/local/Cellar/jupyter/1.0.0_5/libexec/lib/python3.7/site-packages/ipykernel/connect.py", line 18, in <module>
import jupyter_client
File "/usr/local/Cellar/jupyter/1.0.0_5/libexec/lib/python3.7/site-packages/jupyter_client/__init__.py", line 4, in <module>
from .connect import *
File "/usr/local/Cellar/jupyter/1.0.0_5/libexec/lib/python3.7/site-packages/jupyter_client/connect.py", line 23, in <module>
import zmq
File "/usr/local/Cellar/jupyter/1.0.0_5/libexec/vendor/lib/python3.7/site-packages/zmq/__init__.py", line 47, in <module>
from zmq import backend
File "/usr/local/Cellar/jupyter/1.0.0_5/libexec/vendor/lib/python3.7/site-packages/zmq/backend/__init__.py", line 40, in <module>
reraise(*exc_info)
File "/usr/local/Cellar/jupyter/1.0.0_5/libexec/vendor/lib/python3.7/site-packages/zmq/utils/sixcerpt.py", line 34, in reraise
raise value
File "/usr/local/Cellar/jupyter/1.0.0_5/libexec/vendor/lib/python3.7/site-packages/zmq/backend/__init__.py", line 27, in <module>
_ns = select_backend(first)
File "/usr/local/Cellar/jupyter/1.0.0_5/libexec/vendor/lib/python3.7/site-packages/zmq/backend/select.py", line 26, in select_backend
mod = __import__(name, fromlist=public_api)
File "/usr/local/Cellar/jupyter/1.0.0_5/libexec/vendor/lib/python3.7/site-packages/zmq/backend/cython/__init__.py", line 6, in <module>
from . import (constants, error, message, context,
ImportError: cannot import name 'constants'
从上面几行可以看出,它调用了错误的站点包:
Traceback (most recent call last):
File "/Users/cap/.pyenv/versions/3.6.4/lib/python3.6/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/Users/cap/.pyenv/versions/3.6.4/lib/python3.6/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/usr/local/Cellar/jupyter/1.0.0_5/libexec/lib/python3.7/site-packages/ipykernel_launcher.py", line 15, in <module>
from ipykernel import kernelapp as app
File "/usr/local/Cellar/jupyter/1.0.0_5/libexec/lib/python3.7/site-packages/ipykernel/__init__.py", line 2, in <module>
这是我的设置:
- pyenv 用于管理多个版本的 python
- 用于 virtualenvs 的 pipenv(仍然对这个不太满意)
我是如何设置的:
安装全局python(我不喜欢为我的默认python使用pyenv,我保持最新版本)
> brew install python3 # This install 3.7.0
安装 pyenv
> brew install pyenv
安装 python 3.6.4(我需要这个用于 tensorflow)
> pyenv install 3.6.4
安装 pipenv(我这里没有使用 pip 安装程序)
> brew install pipenv
创建一个项目(我有一个 WORKON_HOME 设置,所以我的 .venvs 在我的 ~/.venvs 中创建)
> cd Projects > mkdire test_project > cd test_project > pipenv --python 3.6.4 #create the virtual env
启动虚拟环境
> pipenv shell > python3 -V > Python 3.6.4 # I have validated in another shell that global is still 3.7 > pyenv which python3 > /Users/cap/.pyenv/versions/3.6.4/bin/python3
安装 ipykernel 并设置
> pipenv install ipykernel > ipython kernel install --user --name=lastresort-yyl8tfk8 --display-name "Python (lastresort-yyl8tfk8)"
检查 jupyter 是否看到新内核(注意:我还在 venv 中)
> jupyter kernelspec list > lastresort-yyl8tfk8 /Users/cap/Library/Jupyter/kernels/lastresort-yyl8tfk8
运行jupyter notebook并选择内核
jotebook运行良好,但是当我进入并选择Python(lastresort-yyl8tfk8)时,内核重新启动以加载lastresort-yyl8tfk8内核,我从上面得到错误,它在哪里与 3.7 中的站点包混淆。
我用路径尝试了一堆东西。我什至还求助于 ipython 配置文件更改,例如:iptyhon profile virtual env
我真的需要一些帮助,至少在如何解决这个问题的方向上......
我的最终目标很简单:
能够拥有多个具有相应 ipykernel 的 python 版本,在将它们注册到 jupyter 安装是全局的 jupyter 之后,我可以从他们的虚拟环境中运行它们。通过这种方式,我可以将我的代码和笔记本保存在他们的项目文件夹中,其中包含用于包的 venvs。实际上很简单,我只是不知道我在搞砸什么。
谢谢大家!
更新: 我刚刚验证,如果我删除全局 jupyter 笔记本并将其安装在 venv 中,它可以正常工作。我没想到它不会,但仍然如此。
更新: 这似乎是一些 PYTHONPATH 恶作剧,但我不知道如何解决它。
更新: 尝试按照评论中的建议使用 python -m 运行,但它产生了相同的结果。出于某种原因,当我使用激活的虚拟环境(在 ipython 中正确设置了 python3.6)调用 jupyter notebook(安装在虚拟环境之外)时,它不会调用正确的 3.6 站点包。
我见过很多人使用这种设置。我真的不知道从这里去哪里。
解决方案
TLDR
对我来说,它可以在使用以下命令jupyter
创建的虚拟环境中安装:pipenv
pipenv run pip install jupyter
太短了,想看!
我在使用 python 3 版本时遇到了同样的问题,所以我开始使用pipenv
你展示的,简单的Pipfile
配置如下:
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
[packages]
numpy = "*"
pandas = "*"
matplotlib = "*"
[requires]
python_version = "3.7"
我认为,当我在该配置文件中将 python 版本指定为 3.7 时,每当我想运行pipenv run jupyter notebook
时,内核都会在 Python 3.7 下运行......但是当导入时,笔记本上显示的库:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
我收到“未安装模块错误”
ModuleNotFoundError: No module named 'matplotlib'
然后在同一个笔记本中,我使用以下代码检查了内核运行的版本:
import sys
print(sys.version)
输出显示它在 Python 3.6 下运行,所以在那个版本中我没有安装这些模块,原因pipenv
是为 3.7 版本安装它们。
所以我尝试再次安装 jupyter ,但这次是在创建的虚拟环境下pipenv
,使用run
命令和pip
工具:
pipenv run pip install jupyter
它对我有用!