Un moyen robuste pour assurer que d'autres personnes peuvent exécuter mon programme python


17

Je souhaite placer un programme python sur GitHub et demander à d'autres personnes de le télécharger et de l'exécuter sur leurs ordinateurs avec des systèmes d'exploitation assortis. Je suis relativement nouveau sur python mais je l'ai suffisamment utilisé pour avoir remarqué que faire fonctionner les versions assorties de tous les modules inclus peut être problématique. Je viens de découvrir l'utilisation de requirements.txt(généré avec pipreqset déployé avec la commande pip install -r /path/to/requirements.txt) mais j'ai été très surpris de constater que cela requirements.txtn'indique pas réellement quelle version de python est utilisée, donc ce n'est évidemment pas la solution complète en soi. Ma question est donc la suivante: quel ensemble de spécifications / fichiers / quelque chose d'autre est nécessaire pour s'assurer que quelqu'un qui télécharge mon projet sera en mesure de l'exécuter avec le moins de problèmes possible.

EDIT: Mon plan était d'être guidé par la réponse qui a obtenu le plus de votes positifs. Mais jusqu'à présent, après 4 réponses et 127 vues, pas une seule réponse n'a même un vote positif. Si certaines des réponses ne sont pas bonnes, il serait utile de voir certains commentaires pour expliquer pourquoi elles ne sont pas bonnes.


1
pour le moins de problèmes possibles, avez-vous envisagé Docker (ou d'autres solutions basées sur des conteneurs)? docker.com
Zaccharie Ramzi

Re: Docker ... Je viens de trouver ceci: "le développeur peut être assuré que l'application fonctionnera sur n'importe quelle autre machine Linux" - mais je veux que cela fonctionne sur n'importe quel système d'exploitation. ( opensource.com/resources/what-docker )
Mick

Normalement, vous avez un support pour tous les systèmes d'exploitation classiques: fenêtres ( docs.docker.com/docker-for-windows ) et mac ( docs.docker.com/docker-for-windows )
Zaccharie Ramzi

2
La réponse ici est hautement contextuelle. Le programme Python fait-il des choses qui sont sysou osou des fonctions de type sous-processus ou plus mathématiques / analytiques? Le premier peut changer avec chaque version de Python et plus tard, il peut être assez indépendant de la version. Quelles bibliothèques dépendantes? numpy et pandas font un travail incroyable sur toutes les plateformes, vous pouvez donc simplement vérifier que vous avez une version min. Quelle version majeure de Python? La différence entre Python 2.x et 3.x avec les bibliothèques dépendantes devient encore plus difficile. Si vous écrivez un bon code ciblant une version majeure commune, c'est un bon début.
dawg

2
Comme en témoigne la multitude de réponses, il y a tellement de façons de procéder. Je suis vraiment curieux de savoir si les réponses changeraient en fonction de savoir ce que l'application est. J'aimerais croire que cela ne devrait pas avoir d'importance, mais je soupçonne que c'est possible. Je pense aussi que cela dépend beaucoup du public visé. Docteur en physique avisé exécutant une application d'apprentissage automatique vs Joe Internet jouant un pygame de dames.
Marcel Wilson

Réponses:


15

Avez-vous envisagé de créer un setup.pyfichier? C'est un moyen pratique de regrouper tous vos ... bien installés dans un seul endroit. Donc, tout ce que votre utilisateur doit faire, c'est A) cloner votre dépôt et B) exécuter pip install .pour exécuter lesetup.py

Il y a une grande discussion de pile à ce sujet.

Ainsi qu'un exemple de poignée écrit par le gars des requêtes.

Cela devrait couvrir la plupart des cas d'utilisation. Maintenant, si vous voulez le rendre vraiment distribuable, vous voudrez peut-être envisager de le configurer dans PyPi , le centre de distribution officiel.

Au-delà de cela, si vous demandez comment rendre un programme "indépendant du système d'exploitation", il n'y a pas de solution unique. Cela dépend de ce que vous faites avec votre code. Nécessite de rechercher comment votre code particulier interagit avec ces systèmes d'exploitation, etc.


7

Il y a beaucoup, beaucoup, beaucoup, beaucoup, beaucoup, beaucoup, beaucoup de façons de le faire. Je vais patiner sur les principes derrière chacun, et c'est un cas d'utilisation.

1. Un environnement python

Il y a plusieurs façons de procéder. pipenv, conda,, requirments.txtetc., etc.

Avec certains d'entre eux, vous pouvez spécifier des versions de python. Avec d'autres, spécifiez simplement une gamme de versions de python avec lesquelles vous savez qu'il fonctionne - par exemple, si vous utilisez python 3.7, il est peu probable qu'il ne prenne pas en charge la version 3.6; il n'y a qu'un ou deux changements mineurs. 3.8 devrait également fonctionner.

Une autre méthode similaire est setup.py. Ceux-ci sont généralement utilisés pour distribuer des bibliothèques - comme PyInstaller (une autre solution que je mentionnerai ci-dessous), ou numpy, ou wxPython, ou PyQt5, etc. - pour une utilisation en ligne d'importation / commande. Le guide d'empaquetage python est très utile, et il existe de nombreux tutoriels. (google python setup.py tutorial) Vous pouvez également spécifier des exigences dans ces fichiers.

2. Un conteneur

Docker est le grand. Si vous n'en avez pas entendu parler, je serai surpris. Un rapide google d'un résumé arrive avec cela , dont je citerai une partie:

Alors, pourquoi tout le monde aime les conteneurs et Docker? James Bottomley, anciennement CTO de Parallels pour la virtualisation des serveurs et développeur leader du noyau Linux, a expliqué que les hyperviseurs VM, tels que Hyper-V, KVM et Xen, sont tous "basés sur l'émulation de matériel virtuel. Cela signifie qu'ils sont gros en termes de Configuration requise."

Les conteneurs, cependant, utilisent des systèmes d'exploitation partagés. Cela signifie qu'ils sont beaucoup plus efficaces que les hyperviseurs en termes de ressources système. Au lieu de virtualiser le matériel, les conteneurs reposent sur une seule instance Linux. Cela signifie que vous pouvez «laisser derrière vous les déchets inutiles de VM à 99,9%, vous laissant avec une petite capsule soignée contenant votre application».

Cela devrait vous le résumer. (Notez que vous n'avez pas besoin d'un système d'exploitation spécifique pour les conteneurs.)

3. Un fichier exécutable

Il existe 2 outils principaux qui le font au moment de la rédaction. PyInstaller et cx_Freeze. Les deux sont activement développés. Les deux sont open source.

Vous prenez votre script et l'outil le compile en bytecode, trouve les importations, les copie et crée un environnement python portable qui exécute votre script sur le système cible sans que l'utilisateur final n'ait besoin de python.

Personnellement, je préfère PyInstaller - je suis l'un des développeurs. PyInstaller fournit toutes ses fonctionnalités via un script de ligne de commande, et prend en charge la plupart des bibliothèques auxquelles vous pouvez penser - et est extensible pour en prendre davantage en charge. cx_Freeze nécessite un script de configuration.

Les deux outils prennent en charge Windows, Linux, macOS, etc. PyInstaller peut créer des exes de fichier unique ou un ensemble de dossiers, tandis que cx_Freeze ne prend en charge qu'un ensemble de dossiers. PyInstaller 3.6 prend en charge python 2.7 et 3.5-3.7 - mais 4.0 ne prend pas en charge python 2. cx_Freeze a supprimé la prise en charge de python 2 depuis la dernière version majeure (6.0 je pense).

Quoi qu'il en soit, assez sur les fonctionnalités des outils; vous pouvez les examiner vous-même. (Voir https://pyinstaller.org et https://cx-freeze.readthedocs.io pour plus d'informations)

Lorsque vous utilisez cette méthode de distribution, vous fournissez généralement du code source sur le référentiel GitHub, quelques exes (un pour chaque plate-forme) prêts à être téléchargés et des instructions sur la façon de construire le code dans un fichier exécutable.


1

Le meilleur outil que j'ai utilisé jusqu'à présent pour cela est Pipenv . Non seulement il unifie et simplifie l'ensemble du flux de travail pip + virtualenv pour vous, développeur, mais il garantit également que les versions exactes de toutes les dépendances (y compris Python lui-même) sont respectées lorsque d'autres personnes exécutent votre projet avec.

Le site Web du projet explique très bien comment utiliser l'outil, mais, par souci d'exhaustivité, je vais donner une brève explication ici.

Une fois que vous avez installé Pipenv (par exemple, en exécutant pip install --user pipenv), vous pouvez aller dans le répertoire de votre projet et exécuter pipenv --python 3.7, afin que Pipenv crée un nouveau virtualenv pour votre projet, crée un Pipfile et un Pipfile.lock (plus sur eux plus tard) . Si vous continuez et exécutez, pipenv install -r requirements.txtil installera tous vos packages. Vous pouvez maintenant faire un pipenv shellpour activer votre nouveau virtualenv, ou pipenv run your_main_file.pysimplement pour exécuter votre projet.

Voyons maintenant le contenu de votre fichier Pipfile. Cela devrait ressembler à ceci:

[packages]
Django = "*"
djangorestframework = "*"
iso8601 = "*"
graypy = "*"
whitenoise = "*"

[requires]
python_version = "3.7"

Ce fichier contient les spécifications lisibles par l'homme pour les dépendances de votre projet (notez qu'il spécifie également la version Python). Si votre requirements.txt avait des versions épinglées, votre Pipfile pourrait également les avoir, mais vous pouvez les utiliser en toute sécurité, car les versions exactes sont stockées dans le Pipfile.lock. Vous pouvez maintenant exécuter des choses comme pipenv updatemettre à jour vos dépendances et n'oubliez pas de valider Pipfile et Pipfile.lock dans votre VCS.

Une fois que les gens ont cloné votre projet, tout ce qu'ils ont à faire est de s'exécuter pipenv installet Pipenv s'occupe du reste (il peut même installer la bonne version de Python pour eux).

J'espère que cela a été utile. Je ne suis d'aucune façon affilié à Pipenv, je voulais juste partager cet outil génial.


1

Si votre programme est moins sur l'interface graphique ou a une interface graphique Web, vous pouvez partager le code à l'aide de Google Colaboratory.

https://colab.research.google.com/

Tout le monde peut l'exécuter avec le même environnement. Pas besoin d'installation.


1

Dans le cas où la conversion de tous vos scripts python en un seul exécutable peut vous aider, ma réponse ci-dessous vous aiderait ...

Je développe une grande application de bureau purement en python depuis 3 ans. Il s'agit d'un outil basé sur une interface graphique construit au-dessus de la bibliothèque pyqt (liaisons python du framework QT C ++).

J'utilise actuellement la bibliothèque d'empaquetage " py2exe ": est une extension distutils qui permet de construire des programmes exécutables Windows autonomes (32 bits et 64 bits) à partir de scripts Python; il vous suffit de:

  1. installer py2exe: 'pip installer py2exe'

  2. Créer un script setup.py: Il est utilisé pour spécifier le contenu de l'EXE final (nom, icône, auteur, fichiers de données, bibliothèques partagées, etc.)

  3. Exécuter: python setup.py py2exe

J'utilise également le logiciel "Inno Setup" pour créer l'installateur: création de raccourcis, paramétrage des variables d'environnement, icônes, etc ...


py2exe n'a pas été mis à jour depuis des années. Je ne trouve aucune activité récente. Je suppose alors que ce n'est pas entretenu. (En outre, il ne prend en charge que python <3.4. Cela signifie qu'il ne prend en charge que les versions obsolètes de python).
Legorooj


-1

Parce qu'il manque dans les autres réponses, je voudrais ajouter un aspect complètement différent:

Tests unitaires. Ou les tests en général.

Habituellement, il est bon d'avoir une bonne configuration connue. Selon les dépendances du programme, vous devrez peut-être tester différentes combinaisons de packages. Vous pouvez le faire de manière automatisée avec par exemple toxou dans le cadre d'un pipeline CI / CD.

Il n'y a pas de règle générale sur la combinaison de packages à tester, mais la compatibilité python2 / 3 est généralement un problème majeur. Si vous avez de fortes dépendances sur des packages avec des différences de version majeures, vous pouvez envisager de tester par rapport à ces différentes versions.


Il s'agit d'un aspect très important du développement logiciel. Cependant, cela ne répond absolument pas à la question . Comment les tests unitaires aident-ils à la distribution d'un programme?
Legorooj

À mon humble avis, OP ne pose pas de question spécifique sur la distribution. Il demande des moyens de s'assurer que d'autres personnes peuvent exécuter son programme. Je pense que les tests unitaires peuvent réellement aider à le faire, car les gens peuvent être limités dans l'ensemble de packages qui peuvent être utilisés. En général, la question de la distribution est importante (et a été répondue ici), mais je pense que dans un scénario réel, nous ne pouvons pas compter sur la création d'un venv entier juste pour un seul paquet - il doit être compatible avec au moins certaines configurations standard.
Dschoni

Je ne conteste pas que les tests unitaires sont utiles pour s'assurer qu'ils fonctionnent correctement, mais l'OP a demandé comment partager le code d'une manière "facile à installer". C'est pourquoi je pense que c'est une réponse invalide - pour cette question spécifique.
Legorooj

Je pense toujours que la question ne concerne pas seulement la distribution. C'est pourquoi j'ai ajouté cette réponse. Si vous développez sur Windows par exemple, les tests sur Unix sont essentiels si vous voulez vous assurer qu'il fonctionne avant la distribution.
Dschoni

Par curiosité, en quoi est-ce différent de ce que je viens de dire? ... making sure it runs correctly ...? Le test est un élément essentiel de faire en sorte qu'il fonctionne correctement, il est donc un élément essentiel de la préparation pour le distribuer, mais il est encore rien à voir avec effectivement distribuer ce
Legorooj

-1

Je vais vous donner un très bref résumé de certaines des solutions disponibles existantes en matière de packaging python parmi lesquelles vous pouvez choisir (la connaissance c'est le pouvoir):

  1. Suivez les directives fournies dans Structuring Your Project , ces conventions sont largement acceptées par la communauté python et c'est généralement un bon point de départ lorsque les nouveaux arrivants commencent à coder en python. En suivant ces directives, les pythonistes regardant votre projet / source sur github ou d'autres endroits similaires sauront immédiatement comment l'installer. De plus, le téléchargement de votre projet sur pypi ainsi que l'ajout de CI en suivant ces règles seront indolores.

  2. Une fois que votre projet est correctement structuré selon les conventions standard, l'étape suivante pourrait être d'utiliser certains des congélateurs disponibles , au cas où vous voudriez expédier à vos utilisateurs finaux un package qu'ils peuvent installer sans les forcer à installer python sur leur Machines. Soyez conscient que ces outils ne vous fourniront aucune protection de code ... dit autrement, extraire le code python d'origine des artefacts finaux serait trivial dans tous les cas

  3. Si vous souhaitez toujours expédier votre projet à vos utilisateurs sans les forcer à installer une dépendance de développement et que vous vous souciez également de la protection du code, vous ne voulez donc pas considérer les congélateurs existants, vous pouvez utiliser des outils tels que nuitka , shedskin , cython ou similaires. Inverser généralement le code des artefacts produits par ces outils n'est pas du tout trivial ... La protection contre les fissures, d'autre part, est une question différente et à moins que vous ne fournissiez pas de binaire physique à votre utilisateur final, vous ne pouvez pas faire grand-chose à ce sujet autre que de les ralentir :)

  4. De plus, au cas où vous auriez besoin d'utiliser des langues externes dans votre projet python, un autre lien classique qui vous vient à l'esprit serait https://wiki.python.org/moin/IntegratingPythonWithOtherLanguages , en ajoutant les systèmes de construction de ces outils à CI en suivant les règles de 1 seraient assez faciles.

Cela dit, je vous suggère de vous en tenir au point 1 car je sais que ce sera plus que suffisant pour vous aider à démarrer, ce point particulier devrait également couvrir de nombreux cas d'utilisation existants pour les projets "standard" en python.

Bien que cela ne soit pas destiné à être un guide complet en suivant ceux-ci, vous pourrez publier votre projet python auprès des masses en un rien de temps.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.