Partager un logiciel Python sur plusieurs OS

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

J'ai développé un logiciel en Python (3.5) avec PyQt5 et je souhaiterais le partager à un groupe restreint de personnes qui ne possèdent pas nécessairement de grandes compétences en informatique. Je me demandais alors qu'elle était la méthode la plus simple pour eux pour utiliser mon logiciel.

Pour gérer le côté multi-plateforme, j'étais de base parti sur une image .ova prête à l'utilisation qu'ils auraient importée dans VirtualBox, mais je me rends compte que ce n'est pas si simple (appremment, toutes les machines ne supportent pas la virtualisation 64 bits) et un peu lourd.

Auriez-vous des conseils à ce sujet ?

Merci. :)

+0 -0

Salut,

A mon avis ce qui est de loin le plus simple, c'est de produire un exécutable natif avec quelque chose comme Py2Exe. Il doit sûrement y avoir des équivalents pour linux et mac.

Évidemment, ça marche à condition que tu aies développé ton application pour être réellement multiplateforme à la base. Sinon tu seras restreint au(x) système(s) dans le(s)quel(s) les bibliothèques/modules que tu utilises sont compatibles. Exemple idiot mais si tu utilises l'API windows, ça ne marchera évidemment pas sur mac.

En bonus, tu peux créer un installateur avec InnoSetup, ça rendra la vie des utilisateurs de windows encore plus simple. Vu que le concept d'installateur n'est pas très populaire sur les autres OS, je ne pense pas qu'il y ait de réel équivalent ici. Pour linux par exemple, à voir ce qui est le plus simple entre une bête archive à décompresser, et un fichier à importer dans le gestionnaire de paquets (p.ex. un .deb ou un .rpm)

Ma plateforme avec 23 jeux de société classiques en 6 langues et 13000 joueurs: http://qcsalon.net/ | Apprenez à faire des sites web accessibles http://www.openweb.eu.org/

+0 -0

Je déconseillerais en premier lieu les solutions à base de cxfreeze ou py2exe, qui embarque un interpréteur Python et toute la bibliothèque standard pour chaque projet, alors que ça peut très bien être partagé.

Je dirais plutôt de s'orienter vers un paquet, pour les systèmes qui proposent un gestionnaire de paquets, et d'y régler les bonnes dépendances. Pour les systèmes moins évolués, construire un installeur qui se chargera de la résolution des dépendances et de placer le projet là où il se doit.

Staff

Salut,

La solution la plus simple et de très loin pour distribuer un code Python avec des dépendances un peu lourdes sur un système est de passer par conda.

I don't mind that you think slowly, but I do mind that you are publishing faster. – W. Pauli

+0 -0

Je déconseillerais en premier lieu les solutions à base de cxfreeze ou py2exe, qui embarque un interpréteur Python et toute la bibliothèque standard pour chaque projet, alors que ça peut très bien être partagé.

Ca, c'est effectivement l'inconvénient de ces solutions. En même temps, ce n'est pas dramatique, on peut s'en sortir avec une distribution qui fait dans les 8-10 Mo. La méthode est comparable avec Java (p.ex. launch4j), et là ça fait beaucoup plus mal !

Par contre vu le public visé, je cite: un groupe restreint de personnes qui ne possèdent pas nécessairement de grandes compétences en informatique, tu n'auras pas beaucoup d'autres choix; surtout sous windows. Va expliquer qu'il faut installer python, puis ton programme, ou qu'il faut passer par pip pour ajouter des dépendances…

C'est clairement pas la solution la plus élégante, j'en conviens, mais c'est la plus pragmatique.

Ma plateforme avec 23 jeux de société classiques en 6 langues et 13000 joueurs: http://qcsalon.net/ | Apprenez à faire des sites web accessibles http://www.openweb.eu.org/

+0 -0

Par contre vu le public visé, je cite: un groupe restreint de personnes qui ne possèdent pas nécessairement de grandes compétences en informatique, tu n'auras pas beaucoup d'autres choix; surtout sous windows. Va expliquer qu'il faut installer python, puis ton programme, ou qu'il faut passer par pip pour ajouter des dépendances…

QuentinC

Mais pourquoi il n'y aurait pas un installerait qui s'occuperait d'installer tout ce qu'il manque au niveau du système (que ce soit Python, pip, ou les bibliothèques à installer à partir de ce dernier, puis le code source du programme en question) ?

Je ne sais pas s'il y a des outils simples pour mettre une telle solution en place, mais si ce n'est pas le cas ça me paraît étrange.

Staff

Je ne sais pas s'il y a des outils simples pour mettre une telle solution en place, mais si ce n'est pas le cas ça me paraît étrange.

entwanne

La solution la plus simple et de très loin pour distribuer un code Python avec des dépendances un peu lourdes sur un système est de passer par conda.

adri1

Testé et approuvé par votre serviteur. C'est littéralement un gestionnaire de paquets qui permet notamment d'installer Python et ses dépendances directement en binaire sur n'importe quel OS. Fini le calvaire de la compilation de certaines bibliothèques avec des dépendances externes sous Windows.

I don't mind that you think slowly, but I do mind that you are publishing faster. – W. Pauli

+0 -0
Staff

Sous Linux, le concept de dépendances est très bien compris. Distribue ton soft sur le pypi, puis sudo apt-get install python3-pip && pip3 install --user ton_soft.

De toute façon il n'existe aucune solution qui satisfasse tout le monde. Les os sont différents avec des pratiques et des philosophies différentes, chercher l'uniformité aboutira forcément à un truc bizarre quelque part, à moins de faire un installeur windows qui réalise exactement la même chose que la commande sus-citée.

Mon point de vue, c'est que le pypi est l'approche standard pour distribuer un code Python, donc que le plus simple est déjà de packager ton programme avec distutils et l'héberger sur le Pypi (donc le rendre manuellement installable) avant de broder autour de cette solution, faire un installeur windows qui scripte la détection, le téléchargement et l'installation des dépendances système, de Python et de pip, par exemple, et des paquets .deb ou .rpm qui satisfont la plupart des distributions Linux, etc.. Si un OS n'est pas encore "supporté" il te restera toujours la ressource de proposer un pip install. Certes cette approche ne minimise pas le travail à réaliser, mais d'un autre côté le packaging d'applications n'a jamais été un problème simple, et à mon avis il vaut mieux d'abord proposer le minimum vital qui soit propre et respectueux de la cible, quitte à offrir des alternatives plus simples ensuite suivant la plate-forme.

PS : pip aussi permet de distribuer des binaires, via le format .egg.

Édité par nohar

I was a llama before it was cool

+0 -0
Auteur du sujet

Merci à tous pour vos réponses, je prends enfin le temps d'y réagir.

Pour commencer, le logiciel a été organisé sous forme de bibliothèque Python, ce qui permet de l'installer à l'aide de pip. Seulement, je ne souhaitais pas polluer le système de l'utilisateur donc il me fallait passer un environnement virtuel. Là, à priori deux possibilités :

  • virtualenv
  • conda

virtualenv

Avantages

  • A priori plus léger que conda
  • Peut être installé sans droit d'administration

Inconvénients

  • Ne permet pas d'embarquer une version de Python non installée sur le système
  • En cas d'installation sans droit d'administration, on rencontre des petits soucis avec le PATH

conda

Avantages

  • Installation simple à effectuer si on est administrateur (sous Windows, on a un .exe)
  • Permet d'utiliser n'importe quelle version de Python
  • Facilite l'installation de paquets lourds (scipy par exemple)

Inconvénients

  • Nécessite les droits d'administration

Je suis donc parti sur conda, principalement parce que l'installation de virtualenv se fait en ligne de commande, ce qui ne plait pas nécessairement aux cibles du logiciel.

Concernant l'installation, je fournis un script batch/shell de la forme suivante :

1
2
3
4
5
6
git clone https://aaa:bbb@ccc/repo
cd repo
conda env create -f environment.yml
source activate mon_env
python install.py
source deactivate

Et pour démarrer le logiciel :

1
2
3
4
5
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

source activate mon_env
python "$HERE"/start.py
source deactivate

Le fichier start.py contenant :

1
2
3
import mon_logiciel.start

mon_logiciel.start.start()
+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte