web-dev-qa-db-fra.com

Geler un script python pour chaque système d'exploitation

Au cours des dernières années, j'ai écrit un joli petit programme en python et maintenant j'aimerais le distribuer, mais ma première tentative n'a pas rencontré beaucoup d'enthousiasme, car de nombreux utilisateurs potentiels ne l'ont pas fait 'aime pas l'idée de télécharger et d'installer python et toutes les dépendances nécessaires pour exécuter mon application.

J'ai cherché pendant des semaines une solution pour compiler mon code en quelque chose de facile à exécuter pour tout le monde, mais je ne suis pas vraiment satisfait de ce que j'ai trouvé.

Je n'ai aucun problème avec l'idée de geler l'application au lieu de vraiment la compiler. Cela signifie simplement que l'utilisateur final attendra quelques secondes de plus pour télécharger l'application et occupera plus d'espace sur son disque dur.

Mon problème est de trouver un moyen de regrouper toutes les applications dans un exécutable pour chaque système d'exploitation (disons les gros: windows, mac, linux - évidemment un exécutable différent pour chaque système d'exploitation) sans avoir besoin d'installer des machines virtuelles ou wine ou similaire les options. Je soupçonne fortement que c'est possible, car j'ai vu un tas de jeux ren'py emballés exactement comme je voudrais emballer mon application, mais je ne sais pas comment obtenir le même résultat pour mon programme.

Schématiquement, mon application nécessite une console pour fonctionner et comprend quelques packages maison, numpy et matplotlib. Il dispose également d'un système pour prendre en charge plusieurs langues qui inclut dynamiquement un fichier de langue, écrasant les paramètres précédents:

exec('from lang.%s import lang' % language)

Je soupçonne que cela pourrait créer des problèmes. Enfin, le programme nécessite quelques dossiers pour enregistrer ses paramètres, journaux, etc. lors de la première exécution, ils doivent donc également être inclus. Mon ordinateur exécute ubuntu mate 16.10 (x64) et la version python est 2.7, mais à l’avenir je prévois de la traduire en python 3. Les exécutables créés peut être des fichiers lourds uniques qui contiennent presque tout ce dont vous avez besoin ou des fichiers légers et tout le reste peut être trouvé dans un dossier proche; Je n'ai pas vraiment de préférence pour l'une ou l'autre solution.

Je suis conscient que cette question surgit de temps en temps et a probablement déjà été répondue, mais la dernière occurrence de ce type de question que j'ai pu trouver remonte à 2014, ce qui ressemble à des éons si nous considérons la rapidité avec laquelle les choses changent dans ce domaine .

Edit: Puisqu'il ne semble pas y avoir de solution avec les conditions que j'ai proposées, je peux penser à mettre en place des émulateurs/wrapper/couche de compatibilité/quoi que ce soit pour exécuter un congélateur pour différents OS, mais je ne suis pas vous savez quoi faire. J'ai lu ici et là que wine ne fonctionne pas toujours correctement et ne trouve rien à compiler pour mac sur linux. Pour autant que je comprends, le programme ne devrait pas nécessiter une compilation différente pour les systèmes 32/64 bits, mais s'il existe un moyen facile de compiler pour chaque possibilité, ce serait bien. Les machines virtuelles sont toujours un no go, en ce moment je n'ai pas l'espace sur mon disque pour configurer deux ou plusieurs machines virtuelles (c'est le grand inconvénient des disques ssd ...), sans parler du paiement des licences pour les OS qui le feraient être utilisé plusieurs fois par an pour compiler un logiciel libre.

23
GRB

Comme je ne l'ai pas encore vu ici, je pensais que j'allais parler de Docker. Il semble être un VM distribuable qui contient un package ou une application quelconque. Il existe une édition communautaire gratuite disponible sur github https://github.com/docker/docker . Je ne l'ai jamais utilisé moi-même mais il semble correspondre à tous vos critères - léger, gratuit et indépendant de la plate-forme. Juste quelque chose à explorer.

7
Dan Temkin

Associez d'abord les choses.

  • Python est déjà multiplateforme
  • Le code Python est interprété, pas un langage compilé nativement et n'a pas besoin d'être compilé
  • Il existe des méthodes standard dans Python setuptools pour distribuer des scripts exécutables avec une compatibilité multiplateforme
  • Tiers python peuvent inclure du code natif (en C) qui devra être compilé lors de l'installation ou pour les packages binaires avoir été disponible par les mainteneurs du paquet. NumPy et matplotlib sont dans cette catégorie et ont des paquets binaires disponibles pour les fenêtres AFAIK.

Voici un exemple setup.py code pour installer un script exécutable:

from setuptools import setup, find_packages
setup(<...>,
      entry_points={'console_scripts': [
          '<console cmd name here> = my_package.module:main'
]})

my_package.module est, par exemple

my_package/module.py:

<..>
def main():
    <what to run when <console cmd name here> is executed>

Le package peut ensuite être distribué en tant que module standard python, installable via pip. Si le code est open source, il peut être hébergé sur PyPi (voir les instructions sur le site PyPi pour comment configurer).

Sinon, un package de roue source ou binaire (python setup.py sdist et python setup.py bdist_wheel respectivement) peuvent être créés et distribués à vos utilisateurs.

Les roues binaires devront être construites sur la plate-forme sur laquelle elles doivent être installées, les distributions source fonctionneront sur n'importe quelle plate-forme mais nécessiteront l'exécution de code lors de l'installation car elles contiennent uniquement du code source.

Notez que la construction/installation de packages de roues binaires nécessite pip version> = 6.0 et setuptools> = 26.0.

Lorsque ce package est installé, un exécutable <nom de la console cmd ici> sera disponible pour s'exécuter sur toutes les plateformes sur lesquelles le package peut être installé avec succès.

Pour un exemple de package simple qui fait cela, voir hello-world-python-package , en particulier son setup.py .

Voir site pythonwheels pour plus d'informations sur les packages de roues binaires.

8
danny

La seule plate-forme qui s'attend à ce que les programmes soient un package autonome est ms-windows. C'est principalement pour des raisons historiques relatives à la chaîne d'outils native. Par exemple, jusqu'à la version 2016 de la chaîne d'outils ms (IIRC), Python comme numpy doivent être compilés avec exactement la même version de la chaîne d'outils ms que Python lui-même. Cela rend la construction de modules d'extension pour ms-windows une énorme douleur.

La plupart des systèmes d'exploitation de type UNIX ont une gestion de packages fonctionnelle (bien que dans OS-X d'Apple, cela soit fourni par un tiers). Cela rend l'installation de Python relativement facile.

Ce qui pourrait être utile est de regrouper votre application dans un fichier zip comme youtube-dl le fait. J'ai écrit un script appelé build.py qui fait cela pour certains de mes programmes.

4
Roland Smith

Au travail, je fais quelque chose comme ce que tu veux, et j'ai fini par écrire mon propre code pour le faire. Tout est construit sur Linux, mais j'expédie des packages Linux et Windows. Les packages incluent l'interpréteur et la bibliothèque Python, et ils fonctionnent de manière identique, que le client ait déjà installé Python).

Essentiellement, vous avez besoin d'un petit programme qui incorpore l'interpréteur Python et le configure pour charger uniquement le code Python que vous expédiez, en ignorant tout Python installé par le système). Écrit correctement, ce programme peut être compilé de manière croisée pour chaque architecture que vous souhaitez prendre en charge. Vous expédiez ensuite les DLL Python dont vous avez besoin pour l'architecture, ainsi qu'un fichier Zip contenant le Python code que vous utiliserez (vous n'avez besoin que du .pyc ou .pyo des dossiers). Ce fichier Zip doit également contenir autant de bibliothèque standard que nécessaire.

Avertissements:

  • Vous aurez toujours besoin de machines virtuelles pour les tests.
  • La configuration correcte des compilateurs croisés C pour chaque architecture peut être difficile.
  • Ni le Python site.py ni celui que virtualenv utilise vous isole complètement d'un système Python install. J'ai dû faire ma propre version de site.py.
  • Il est facile de se lier au système Python par erreur. Soyez très prudent sur la façon dont vous utilisez pkg-config et les arguments du compilateur dans vos scripts de construction.
  • Il est facile pour Python d'essayer de charger le système Python bibliothèque par erreur. Soyez très prudent lorsque vous définissez le chemin Python et probablement Py_IgnoreEnvironmentFlag.
  • Pour Windows, vous pouvez aller assez loin avec py2exe, et ce sera plus facile que ce que je suggère. Je n'utilise pas py2exe principalement parce que j'incorpore du code Python dans une application non Python.

Parce que mon application est en Go avec du Python, j'ai écrit mon wrapper en tant que package Go qui appelle Python WSGI code via cgo. Vous pouvez voir la plupart des Python = incorporer du code ici . Ce repo n'est pas toute l'histoire, cependant: les scripts pour la construction personnalisée Python et les scripts de construction et le code d'initialisation pour l'application elle-même ne sont pas 't public en ce moment.

3
MicahStetson

Et JAVA? Enveloppez-vous python code dans Java distribuer en jar ou .exe?

http://www.jython.org/jythonbook/en/1.0/JythonAndJavaIntegration.html

Vous pouvez trouver ce QA utile dans votre cas. Distribution de mes Python sous forme de fichiers JAR avec Jython?

3
oshaiken

Réaction initiale

  • Pour Windows, utilisez p2exe
  • Pour Linux, utilisez le gel de python
  • Pour les macos, utilisez le même gel - devrait fonctionner (juste une supposition, maintenu par une seule recherche Google)

(des modifications peuvent être nécessaires pour votre programme, par exemple __file__ ne peut pas être utilisé)


Autre approche possible au problème initial

<...> n'a pas rencontré beaucoup d'enthousiasme, car de nombreux utilisateurs potentiels n'ont pas aimé l'idée de télécharger et d'installer python

Peut-être que les objections des utilisateurs pourraient être guéries, en incluant python lui-même à côté de votre programme. (Soit le programme d'installation python ou http: // portablepython) .com / )
c'est à dire. ajouter non seulement un lien vers l'installateur, mais tous les installateurs et éventuellement les scripts bat/sh pour tout installer.

3

Ren'Py

Vous mentionnez Ren'Py plusieurs fois. Son documentation décrit comment ajouter Python à un jeu. La section Python Statements décrit même comment ajouter un tiers packages (par exemple numpy et matplotlib). Il peut générer des fichiers pour Windows, Mac et Linux . Si vous pouvez le faire exécuter votre application comme vous le souhaitez, et que vous connaissez déjà , alors vous devriez l'utiliser.

PyInstaller

Une autre option est PyInstaller . Dans la section Supporting Multiple Operating Systems , il dit ceci:

Si vous devez distribuer votre application pour plusieurs systèmes d'exploitation, par exemple Windows et Mac OS X, vous devez installer PyInstaller sur chaque plate-forme et regrouper votre application séparément sur chacune.

Le deuxième paragraphe décrit comment procéder sur une seule machine:

Vous pouvez le faire à partir d'une seule machine en utilisant la virtualisation. La virtualBox gratuite ou le VMWare et Parallels payant vous permettent d'exécuter un autre système d'exploitation complet en tant que "invité". Vous configurez une machine virtuelle pour chaque système d'exploitation "invité". Vous y installez Python, les packages de support dont votre application a besoin et PyInstaller.

PyInstaller annonce prise en charge de numpy et matplotlib .

Machines virtuelles et systèmes d'exploitation hébergés

Vous avez dit que vous n'avez pas de place sur votre SSD pour les machines virtuelles. Vous pouvez acheter un disque dur USB externe et y stocker les machines virtuelles. Ou vous pouvez utiliser un fournisseur d'hébergement de système d'exploitation. Vous pouvez utiliser Google pour en savoir plus à ce sujet. Si vous avez des questions sur la façon d'utiliser un fournisseur d'hébergement spécifique, vous devez créer de nouvelles questions.

Test multiplateforme

Même si vous utilisez Ren'Py, vous devrez presque certainement tester les résultats sur des machines virtuelles ou des systèmes d'exploitation hébergés. La seule façon d'être certain que votre programme fonctionnera correctement sur d'autres plateformes est de le tester sur ces plateformes. La solution d'hébergement vous permet d'éviter "de payer des licences pour des OS qui seraient utilisés plusieurs fois par an pour compiler un logiciel gratuit" . Cependant, vous dépenserez toujours de l'argent pour l'hébergement.

Le prix du gratuit

Si votre objectif est de développer des applications Python pour Windows, Mac et Linux sans dépenser d’argent, alors vous êtes probablement coincé avec Ren'Py et comptez sur les utilisateurs pour vous aider à tester votre application sur leur systèmes d'exploitation.

2
David Cullen

Je ne sais pas ce que vous pensez vraiment en écrivant une application "gel", mais si je comprends bien, vous devez compiler votre code dans un programme d'installation, qui installe simplement toutes les bibliothèques et les fichiers nécessaires pour exécuter votre programme, afin qu'il puisse gérer tout utilisateur d'ordinateur noob.

D'accord. Vous avez maintenant deux choix:

A) Faire un programme d'installation pour chaque système séparément - Vous pouvez utiliser des outils tels que configuration Inno ou PackageBuilder (sur mac) pour créer programme d'installation, ce qui vérifie si est python déjà installé (sinon l'installer) et copiez vos fichiers + faire un raccourci sur le bureau (ou quelque chose comme ça) + exécuter des scripts externes (si vous en avez besoin) ou si vous avez besoin de binaires pour Windows que vous pouvez utiliser Py2exe ou sur mac Py2app . Sur Linux, il n'y a rien de tel, mais si quelqu'un utilisant Linux est généralement un utilisateur avancé.

Si je sais qu'il n'y a pas quelque chose comme un constructeur automatique pour toutes les plates-formes pour construire python installateurs, mais si vous avez de l'argent, vous pouvez augmenter votre travail avec Bitrock Install Builder .

B) Créez votre propre script - Si l'utilisateur a déjà python vous pouvez créer un script pour télécharger et installer des fichiers manuellement ( par moi la meilleure solution si le produit est fait pour les utilisateurs avancés, mais si vous faites une interface graphique, ce ne sera pas un problème pour noob)

2
Samuel Tulach