сбой python virtualenv после обновления fedora с 31 до 33

#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. Посмотрите этот учебник и найдите похожие, чтобы получить все подробности.