Configurer correctement python3.8.6 ou .7 sur debian stretch

Bonjour,

J’ai une application php en production hébergée sur un serveur debian (stretch) – serveur dédié plesk. Ce serveur tourne avec apache et nginx en mode reverse proxy.

Je viens de finaliser dans mon environnement local (ubuntu 18.04) une application django (3.1.4) que je dois déployer sur ce serveur debian. Sur ce dernier, sont installés python 2.7 et 3.5. Python 3.5 n’est pas compatible avec mon application django.

Vue qu’en environnement local mon application django et ses dépendance s’exécutent avec python 3.8.7, j’ai donc décidé d’installer python 3.8.6 sur le serveur debian.

En le faisant, (je m’y suis certainement mal pris) j’obtient des messages d’erreurs lorsque j’essaie de configurer mon application django et/ou python3.8.

Voici les actions entreprises sur debian :
J’ai copié mon projet django dans un repertoire du serveur et j’ai installé python3.8.6. Cependant lorsque j’essaie d’installer virtualenv (pip3 install virtualenv), je reçois le message d’erreur suivant :

Traceback (most recent call last):
      File "/usr/bin/pip3", line 9, in <module>
    from pip import main
ImportError: cannot import name 'main' from 'pip' (/usr/local/lib/python3.8/site-packages/pip/__init__.py)

Besoin d’aide pour pouvoir configurer correctement python3.8 sans déranger mon application en production.

Merci d’avance

Bonjour,
comment as-tu installé python 3.8 au départ?
As-tu upgradé tous les packages existant de ton python en version 3.8 au préalable à l’action pip3?

Bonjour,

Non, j’ai installé python3.8 à coté de python3.5 et python2.7 et j’ai indiqué au système qu’il devait utiliser python3.8 comme version par défaut de python3 à l’aide de :

update-alternatives --config python3

Es-tu sur que tous les packages des modules python 3.8 que tu utilise dans ton applications ont été upgradé via apt?
Vu ton erreur essaye de faie:

sudo python3 -m pip uninstall pip && sudo apt install python3-pip --reinstall

Car tu as probablement mis à jour pip via pip lui même. Hors, un module installé via apt doit être mis à jour via apt, pas par pip.

Lorsque j’exécute la commande proposée, j’obtiens ce message d’erreur.

ERROR: Exception:
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/pip/_internal/cli/base_command.py", line 188, in main
    status = self.run(options, args)
  File "/usr/local/lib/python3.8/site-packages/pip/_internal/commands/uninstall.py", line 48, in run
    with self._build_session(options) as session:
  File "/usr/local/lib/python3.8/site-packages/pip/_internal/cli/base_command.py", line 101, in _build_session
    session = PipSession(
  File "/usr/local/lib/python3.8/site-packages/pip/_internal/download.py", line 559, in __init__
    self.headers["User-Agent"] = user_agent()
  File "/usr/local/lib/python3.8/site-packages/pip/_internal/download.py", line 144, in user_agent
    zip(["name", "version", "id"], distro.linux_distribution()),
  File "/usr/local/lib/python3.8/site-packages/pip/_vendor/distro.py", line 122, in linux_distribution
    return _distro.linux_distribution(full_distribution_name)
  File "/usr/local/lib/python3.8/site-packages/pip/_vendor/distro.py", line 677, in linux_distribution
    self.version(),
  File "/usr/local/lib/python3.8/site-packages/pip/_vendor/distro.py", line 737, in version
    self.lsb_release_attr('release'),
  File "/usr/local/lib/python3.8/site-packages/pip/_vendor/distro.py", line 899, in lsb_release_attr
    return self._lsb_release_info.get(attribute, '')
  File "/usr/local/lib/python3.8/site-packages/pip/_vendor/distro.py", line 552, in __get__
    ret = obj.__dict__[self._fname] = self._f(obj)
  File "/usr/local/lib/python3.8/site-packages/pip/_vendor/distro.py", line 1012, in _lsb_release_info
    stdout = subprocess.check_output(cmd, stderr=devnull)
  File "/usr/local/lib/python3.8/subprocess.py", line 411, in check_output
    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
  File "/usr/local/lib/python3.8/subprocess.py", line 512, in run
    raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '('lsb_release', '-a')' returned non-zero exit status 1.

j’y pense, tu fais bien les commandes en root ou en sudo à chaque fois?
en passant, python 3.8 n’est ni dans stretch ni dans buster. ce qui fait que ta debian Stretch va avoir un problème. car tes python 2 et 3 sont installés via APT, et 3.8 via pip ou autre repo qui ne sont pas de repo debian.

peux tu nous dire comment tu as installé Python 3.8? les commandes exactes?

J’exécute les commandes directement en root.
commandes utilisées pour installer python3.8.6 :

cd /opt/
wget https://www.python.org/ftp/python/3.8.6/Python-3.8.6.tgz
tar xzf Python-3.8.6.tgz
cd Python-3.8.6/
./configure --enable-optimizations
make altinstall
pip3 install virtualenv

ton pip3 est celui d’une autre version, tes différents pythons ne sont pas installés de la même façon. et de fait la commande update-alternatives --config python3 ne sait prendre en compte que ce qui a été installé en mode packagés avec les configurations telles qu’elles sont définies par les packages maintainers.

saufg ereur les packages 3.8 sont peut etre disponible sur la SID mais je n’en suis pas sur car bulleyes est en 3.7 je crois.

Pour pip3 il ne prend pas en compte ton installation 3.8 car il ne la « connait » pas je pense.

Que dois-je faire concrètement pour corriger ce problème?

Si j’ai bien compris, python 3.5 n’est pas compatible avec ton application, mais est-ce que 3.7 est compatible?
Car python 3.7 peut etre installé par apt en utilisant les backports et sera conforme à la structure existante de ton installation.

Pour savoir comment est installé ton python 3.8 il faut savoir quelles sont les opérations réalisées par les commande que tu as faite.
Car ./configure --enable-optimizations implique que tous les autres paramètres sont par défaut. Il faut savoir lesquels.
Quand au make, il faut lui aussi savoir quelle est la configuration du makefile utilisée.

Dans une opération de ce genre, où on cumule deux type d’installation différentes (structurellement un par package, un par sources compilées), il est préférable de passer par une plateforme d’intégration, car passé direct d’une plateforme de developpement (qui n’est pas en conformité avec la production), directement à la production, c’est un risque de casser quelque chose.

Peux tu nous donner les options de configuration par defaut et le makefile des sources?

voila ce qui est possible dans Debian

 apt list | grep python3.8

idle-python3.8/unstable,unstable 3.8.7-1 all
libpython3.8-dbg/unstable 3.8.7-1 amd64
libpython3.8-dbg/unstable 3.8.7-1 i386
libpython3.8-dev/unstable 3.8.7-1 amd64
libpython3.8-dev/unstable 3.8.7-1 i386
libpython3.8-minimal/unstable 3.8.7-1 amd64
libpython3.8-minimal/unstable 3.8.7-1 i386
libpython3.8-stdlib/unstable 3.8.7-1 amd64
libpython3.8-stdlib/unstable 3.8.7-1 i386
libpython3.8-testsuite/unstable,unstable 3.8.7-1 all
libpython3.8/unstable 3.8.7-1 amd64
libpython3.8/unstable 3.8.7-1 i386
python3.8-dbg/unstable 3.8.7-1 amd64
python3.8-dbg/unstable 3.8.7-1 i386
python3.8-dev/unstable 3.8.7-1 amd64
python3.8-dev/unstable 3.8.7-1 i386

Sur les dépots unstables, merci de me confirmer ce dont je doutais.
mais ce n’est pas conseillé d’utiliser ces dépôts sur une machine de production.

Ok je vais tester mon application avec python3.7. Cela ne se voit peut être pas mais je suis novice sur linux. Pourriez-vous m’indiquer les commandes pour installer python3.7 et vous indiquer fournir options de configuration par defaut et le makefile des sources?

Tu nous disais que le serveur était en Debian Stretch.
Qui gère la partie système du serveur? car peut être serait intéressant d’étudier la possibilité de migrer vers Debian Buster (debian 10).
Sinon pour pouvoir utiliser python 3.7, il faut ajouter les repository backports dans le fichier /etc/apt/sources.list en ajoutant:
deb http://ftp.debian.org/debian stretch-backports main

Si tu as besoin de contrib ou de non-free, ajoute contrib et ou non-fre après main sur la même ligne.

C’est moi qui aie la main sur la serveur pour la partie. Je ne pense pas que ce soit une bonne idée de migrer actuellement. A cette période l’année, il y a beaucoup d’activités là et je crains de passer à côté de quelque chose d’important.

Je viens d’ajouter le repository.

C’est clair tu as tout à fait raison. C’est pourquoi il te faudrait une VM avec la même installation que ton serveur . Ca te permettrait de tester la migration. de fait, il te faudrait une machine d’intégration, car sinon tu aura régulièrement ce genre de problématique.

Le méthode consiste en:

  • faire le developpement et les tests qui vont avec sur une machine de développement.
  • faire l’intégration du developpement sur une machine d’intégration conforme à celle qui est en production. cela permet de voir les opérations à réaliser et à documenter ces opérations pour être sur ni d’en oublier ni de se tromper pour la mise en prod. Ca permet aussi de voir où des incidents potentiels ou des erreurs peuvent se glisser, comme ce que tu vient de vivre avec python 3.8.
  • une fois les tests en intégration réalisés et positifs, mettre l’application en production.

C’est valable pour la mise en prod d’une nouvelle application, de nouvelle configuration, de migration etc…

et avec les techniques de virtualisation aujourd’hui le coût est assez mince.

Wahoo !!! Que de précieux conseils que vous venez de me fournir. Je vous en remercie sincèrement.
Bien que je sois pris par le temps, je tacherai d’intégrer au quotidien ces « best parctices ».
Merci @Zargos.

de rien :slight_smile: