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 n'aimaient 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 regardé pendant des semaines à la recherche d'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'ayez aucun problème avec l'idée de geler l'application au lieu de la compiler vraiment. Cela signifie simplement que l'utilisateur final va attendre quelques secondes de plus pour télécharger l'application et occupent 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 grands: windows, mac, linux - évidemment un exécutable différent pour chaque système d'exploitation) sans avoir besoin d'installer des machines virtuelles ou du vin ou des options similaires. Je 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 inclut quelques paquets faits 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 certains problèmes. Enfin, le programme nécessite quelques dossiers pour enregistrer ses paramètres, journaux, etc dans la première exécution, donc ceux-ci devraient être inclus aussi. Mon ordinateur exécute ubuntu mate 16.10 (x64) et la version python est 2.7, mais à l'avenir, je prévois de le traduire en python 3. Les exécutables créés peuvent être des fichiers lourds simples qui contiennent presque tout le nécessaire 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 une solution ou le autre.

Je suis conscient que cette question apparaît de temps en temps et a probablement déjà reçu une réponse, mais la dernière occurrence de ce genre de question que j'ai pu trouver remonte à 2014, ce qui ressemble à il y a des éons si l'on considère la rapidité avec laquelle les choses changent dans ce domaine.

Edit : Comme 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 systèmes D'exploitation, mais je ne le suis pas assurez-vous quoi faire. J'ai lu ici et là que wine ne fonctionne pas toujours correctement et ne trouve rien à compiler pour mac sous linux. Pour autant que je comprenne, 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 toutes les possibilités, ce serait bien. Les machines virtuelles sont toujours un non aller, 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...), encore moins de payer pour licences pour OSs qui seraient utilisées quelques fois par an pour compiler un logiciel libre.

21
demandé sur GRB 2017-02-26 14:12:21

8 réponses

Depuis que je ne l'ai pas encore vu ici, j'ai pensé que je ferais apparaître Docker. Il semble être une machine virtuelle distribuable qui contient un paquet ou une application quelconque. Il y a 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
répondu Dan Temkin 2017-03-06 18:39:13

Quelques choses d'abord.

  • Python est déjà multi-plateforme
  • le code Python est interprété, pas un langage compilé nativement et n'a pas besoin de compiler
  • Il existe des méthodes standard en Python setuptools pour distribuer des scripts exécutables avec une compatibilité multiplateforme
  • les bibliothèques Python tierces peuvent inclure du code natif (en C) qui devra être compilé lors de l'installation ou pour que les paquets binaires aient été disponibles par mainteneurs de paquets. NumPy et matplotlib sont dans cette catégorie et ont des paquets binaires disponibles pour Windows AFAIK.

Voici un exemple de code setup.py 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 paquet peut ensuite être distribué en tant que module Python standard, installable via pip. Si le code est open source, il peut être hébergé sur PyPi (voir les instructions sur le site PyPi pour savoir comment configurer).

Sinon, un package source ou binaire (python setup.py sdist et python setup.py bdist_wheel respectivement) peut être construit et distribué à 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 du code lors de l'installation car elles contiennent du code source purement.

Notez que la construction / installation de paquets de roue binaire nécessite pip version > = 6.0 et setuptools >= 26.0.

Quand ce paquet est installé, un exécutable sera disponible pour s'exécuter sur toutes les plates-formes que le paquet peut être installé avec succès.

Pour un exemple simple de paquet qui fait cela, voir Hello-world-Python-package , en particulier son setup.py .

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

8
répondu danny 2017-03-02 16:10:19

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

La plupart des systèmes D'exploitation de type UNIX gestion des paquets (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 d'emballer votre application dans un fichier zip comme youtube-dl Oui. J'ai écrit un script appelé build.py Cela fait cela pour certains de mes programmes.

4
répondu Roland Smith 2017-03-04 17:08:20

Et JAVA? Enveloppez-vous le code Python dans java distribuer comme jar ou .exe?

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

Vous pouvez trouver cette assurance qualité utile dans votre cas. distribuer mes scripts Python sous forme de fichiers JAR avec Jython?

3
répondu oshaiken 2017-05-23 12:02:05

Je ne sais pas ce que vous pensez vraiment en écrivant l'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 fichiers nécessaires pour exécuter votre programme, afin qu'il puisse gérer n'importe quel utilisateur d'ordinateur noob.

Ok. Maintenant, vous avez deux choix:

A) Faire installer pour chaque système séparément - Vous pouvez utiliser des outils tels que Inno setup ou PackageBuilder (sur mac) pour créer un installateur, que vérifier 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 avez besoin) ou si vous avez besoin de binaires pour windows, vous pouvez utiliser Py2exe {[8] } ou sur mac Py2app . Sur Linux, il n'y a rien de tel, mais si quelqu'un utilise Linux, c'est généralement un utilisateur avancé.

Si je sais qu'il n'y a pas quelque chose comme automatic builder pour toutes les plates-formes pour construire des installateurs python, mais si vous avez de l'argent, vous pouvez booster votre travail avec Bitrock Installer le Générateur de.

B) Faites votre propre script - Si l'Utilisateur a déjà python, vous pouvez faire 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
répondu Samuel Tulach 2017-03-04 15:29:20

Ren'PY

Vous mentionnez Ren'Py plusieurs fois. Sa documentation décrit comment ajouter du code Python à un jeu. La section instructions Python décrit même Comment ajouter des paquets tiers (par exemple numpy et matplotlib). Il peut générer des fichiers pour Windows, Mac et Linux . Si vous pouvez l'obtenir pour exécuter votre application comme vous le souhaitez, et vous êtes déjà familier avec elle, alors vous devriez utiliser il.

PyInstaller

Une autre option est PyInstaller . Dans la section prise en charge de plusieurs systèmes d'exploitation , il est dit ceci:

Si vous devez distribuer votre application pour plus d'un système 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 faire cela sur une seule machine:

Vous pouvez faire ceci à partir d'une seule machine utilisant la virtualisation. La VirtualBox gratuite ou les VMware et Parallels payants vous permettent d'exécuter un autre système d'exploitation complet en tant qu ' "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

Tu as dit que tu n'avais pas de place sur votre SSD pour les machines virtuelles. Vous pouvez acheter un disque dur USB externe et stocker les machines virtuelles sur elle. Ou vous pouvez utiliser un système d'exploitation fournisseur d'hébergement. Vous pouvez utiliser Google pour en savoir plus sur ces. Si vous avez des questions sur l'utilisation d'un fournisseur d'hébergement spécifique, vous devez créer de nouvelles questions.

Test Multiplate-Forme

Même si vous utilisez Ren'Py, vous aurez certainement besoin de 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 plates-formes est de le tester sur ces plates-formes. La solution d'hébergement permet d'éviter "de payer pour des licences D'OSs qui seraient utilisées quelques fois par an pour compiler un logiciel libre". Toutefois, vous serez toujours dépenser de l'argent pour l'hébergement.

Le prix de livraison

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 en s'appuyant sur les utilisateurs pour vous aider à tester votre application sur leurs systèmes d'exploitation.

2
répondu David Cullen 2017-03-04 18:07:03

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

Essentiellement, vous avez besoin d'un petit programme qui intègre 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. Écrire correctement, ce programme peut être compilé pour chaque architecture que vous voulez soutenir. Vous expédiez ensuite les DLL Python dont vous avez besoin pour l'architecture, ainsi qu'un fichier zip contenant le code Python que vous utiliserez (vous n'avez besoin que des fichiers .pyc ou .pyo). Ce fichier zip doit également contenir autant de la bibliothèque standard que nécessaire.

Mises en garde:

  • vous voulez toujours des machines virtuelles pour les tests.
  • la configuration correcte des compilateurs croisés C pour chaque architecture peut être difficile.
  • Ni site.py de Python ni celui que virtualenv utilise ne vous isole complètement d'une installation Python du système. J'ai dû faire ma propre version de site.py.
  • Il est facile de lier contre le 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 la bibliothèque Python système par erreur. Faites très attention à définir 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 comme un paquet Go qui appelle le code Python WSGI via cgo. Vous pouvez voir la plupart du code d'intégration Python ici . Ce repo n'est pas toute l'histoire, cependant: les scripts pour la construction Python personnalisée et les scripts de construction et le code d'initialisation de l'application elle-même ne sont pas publics en ce moment.

2
répondu MicahStetson 2017-03-07 19:50:01

La réaction Initiale de

  • Pour windows utiliser p2exe
  • Pour linux, utilisez le gel de python
  • pour macos, utilisez le même gel-devrait fonctionner (juste une supposition, tenue par une seule recherche google)

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


Approche alternative Possible au problème initial

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

Peut-être que les objections de l'utilisateur pourraient être guéries, en incluant Python installer lui-même à côté de votre programme. (installateur Python réel 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.

2
répondu industryworker3595112 2017-03-08 05:48:20