#virtualenv #upgrade #python-3.7 #fedora #jupyter-lab
#virtualenv #Обновление #python-3.7 #fedora #jupyter-лаборатория
Вопрос:
Когда я обновил fedora с 31 до 33, я обнаружил, что базовый пакет python был обновлен с 3.7.9 до 3.9, и что ссылки на python в папках виртуальной среды теперь указывают на новую версию python.
Не было никаких проблем с активацией моей виртуальной среды python 3.7
[bou@bous-fed33 avguide]$ source ~/py37/bin/activate
(py37) [bou@bous-fed33 avguide]$ which python
~/py37/bin/python
Однако версия python была уже не 3.7.9, а 3.9, которая поставлялась с fedora 33
(py37) [bou@bous-fed33 avguide]$ python -V
Python 3.9.0
Теперь, когда я попытался запустить jupyter notebook, возникают ошибки ModuleNotFoundError
(py37) [bou@bous-fed33 avguide]$ jupyter notebook --port 7777
[W 09:14:02.710 NotebookApp] Error loading server extension jupyterlab
ModuleNotFoundError: No module named 'jupyterlab'
Также получайте ошибки для других пакетов, таких как pandas, numpy и т. Д., Которые Раньше были в порядке.
(py37) [bou@bous-fed33 avguide]$ python
Python 3.9.0 (default, Oct 6 2020, 00:00:00)
[GCC 10.2.1 20200826 (Red Hat 10.2.1-3)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as ps
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'pandas'
Я попытался переустановить все пакеты из существующих requirements.txt файловые и ручные переустановки также завершились неудачно с ошибками. Также не было смысла переустанавливать python 3.7, поскольку он все еще был там.
(py37) [bou@bous-fed33 avguide]$ pip3 install --force-reinstall -r requirements.txt
[bou@bous-fed33 avguide]$ sudo dnf install python37
Package python3.7-3.7.9-2.fc33.x86_64 is already installed.
Через некоторое время я нашел относительно простое ИСПРАВЛЕНИЕ.
Управление версиями python осуществляется с помощью символических ссылок в виртуальных папках env. Итак, все, что нам нужно сделать, это найти местоположение существующего двоичного файла python для версии 3.7.9 или любой другой версии python, используемой вашей виртуальной средой, и обновить символические ссылки, чтобы указать на правильные базовые пакеты python.
Это версии python, установленные в моей fedora OS / base.
[bou@bous-fed33 ~]$ ls -ltr /usr/bin/python3*
-rwxr-xr-x. 2 root root 15536 Sep 22 19:23 /usr/bin/python3.7
-rwxr-xr-x. 1 root root 15536 Sep 25 23:37 /usr/bin/python3.8
lrwxrwxrwx. 1 root root 9 Oct 7 00:19 /usr/bin/python3 -> python3.9 <<<
-rwxr-xr-x. 1 root root 15536 Oct 7 00:20 /usr/bin/python3.9 <<<
Обратите внимание, как /usr/bin/python3
указывает на python3.9
Найдите символические ссылки в ~/py37/bin/
папке виртуальной среды
[bou@bous-fed33 avguide]$ cd ~/py37/bin/
[bou@bous-fed33 bin]$ ls -ltr python*
lrwxrwxrwx. 1 bou bou 16 Dec 29 2019 python3 -> /usr/bin/python3
lrwxrwxrwx. 1 bou bou 7 Dec 29 2019 python -> python3
Обратите внимание, как python
указывает python3
и python3
, в свою очередь, указывает на пакет операционной системы /usr/bin/python3
, который после обновления fedora python больше не указывает /usr/bin/python3.7
, а указывает на новую версию python /usr/bin/python3.9
Итак, все, что нам нужно сделать, это удалить существующие программные ссылки
[bou@bous-fed33 bin]$ rm python3 python
А затем создайте новые файлы или символические ссылки python3
, python
которые указывают на python3.7
двоичный файл в /usr/bin/python3.7
[bou@bous-fed33 bin]$ ln -s /usr/bin/python3.7 python3
[bou@bous-fed33 bin]$ ln -s python3 python
Активируйте виртуальную среду и проверьте правильность версии python.
[bou@bous-fed33 bin]$ ls -ltr python*
lrwxrwxrwx. 1 bou bou 18 Dec 2 10:03 python3 -> /usr/bin/python3.7
lrwxrwxrwx. 1 bou bou 7 Dec 2 10:04 python -> python3
[bou@bous-fed33 avguide]$ source ~/py37/bin/activate
(py37) [bou@bous-fed33 avguide]$ python -V
Python 3.7.9
(py37) [bou@bous-fed33 avguide]$ which python
~/py37/bin/python
(py37) [bou@bous-fed33 avguide]$ python
Python 3.7.9 (default, Sep 22 2020, 09:19:36)
[GCC 10.2.1 20200826 (Red Hat 10.2.1-3)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd
>>> quit()
Мы вернули правильную версию python для нашей виртуальной среды, и теперь JupyterLab работает нормально.
(py37) [bou@bous-fed33 avguide]$ jupyter notebook --port 7777
[I 10:07:54.408 NotebookApp] JupyterLab extension loaded from /home/bou/py37/lib64/python3.7/site-packages/jupyterlab
[I 10:07:54.408 NotebookApp] JupyterLab application directory is /home/bou/py37/share/jupyter/lab
[I 10:07:54.410 NotebookApp] The Jupyter Notebook is running at:
[I 10:07:54.410 NotebookApp] https://bous-fed33:7777/
Надеюсь, это поможет кому-то столкнуться с аналогичными проблемами при использовании виртуальной среды python после обновления базовой ОС и / или python до новой версии.
Ответ №1:
Лучшим решением является использование pyenv, поскольку он специально разработан для этой ситуации.
Pyenv будет доступен в вашем репозитории пакетов … так что попробуйте поиск pyenv, затем установите.
Посмотрите все доступные версии Python, которые pyenv может установить для вас:
$ pyenv install --list
Затем выберите из списка, например. вы увидите отсутствующий Python 3.7.9. Установите его в свой локальный магазин pyenv, что позволит вам использовать его в вашей виртуальной среде:
$ pyenv install 3.7.9
Затем вы можете активировать его в каталоге, содержащем ваш виртуальный env:
$ cd avguide
$ python --version
Python 3.9.0
$ pyenv local 3.7.9
$ python --version
Python 3.7.9
и он автоматически позаботится о ваших двоичных ссылках python. Посмотрите этот учебник и найдите похожие, чтобы получить все подробности.