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 pipreqs
et déployé avec la commande pip install -r /path/to/requirements.txt
) mais j'ai été très surpris de constater que cela requirements.txt
n'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.
sys
ouos
ou 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.Réponses:
Avez-vous envisagé de créer un
setup.py
fichier? 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écuterpip 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.
la source
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.txt
etc., 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. (googlepython 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:
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.
la source
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écuterpipenv --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.txt
il installera tous vos packages. Vous pouvez maintenant faire unpipenv shell
pour activer votre nouveau virtualenv, oupipenv run your_main_file.py
simplement pour exécuter votre projet.Voyons maintenant le contenu de votre fichier Pipfile. Cela devrait ressembler à ceci:
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 update
mettre à 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 install
et 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.
la source
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.
la source
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:
installer py2exe: 'pip installer py2exe'
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.)
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 ...
la source
Je pense que vous pouvez utiliser Docker avec votre python https://github.com/celery/celery/tree/master/docker
veuillez suivre les fichiers et je pense que vous pouvez trouver le moyen de créer votre fichier docker pour vos scripts python!
la source
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
tox
ou 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.
la source
... 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 ceJe 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):
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.
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
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 :)
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.
la source