Comment déployer une application Python avec les bibliothèques comme source sans autre dépendances?

StackOverflow https://stackoverflow.com/questions/527510

Question

Historique : J'ai une petite application Python qui rend la vie pour les développeurs de logiciels dans notre libération entreprise un peu plus facile. Je construis un exécutable pour Windows en utilisant py2exe. L'application ainsi que le binaire sont vérifiées dans Subversion. Distribution arrive par des gens vérifier le répertoire de SVN. Le programme comporte environ six différentes dépendances de bibliothèques python (par exemple elementtree, Mako)

La situation : Les développeurs veulent pirater la source de cet outil, puis l'exécuter sans avoir à construire le binaire. À l'heure actuelle, cela signifie qu'ils ont besoin d'un python 2.6 interprète (ce qui est bien) et aussi les 6 bibliothèques installées localement easy_install.

Le problème

  • Ce n'est pas publique, l'environnement open source classique: Je suis à l'intérieur d'un réseau d'entreprise, l'outil ne quittera jamais le « jardin clos » et nous avons des obstacles sérieux qui dérangent à se rendre à l'authentification Internet à l'extérieur (NTLM procurations et / ou machines sans accès direct à Internet).
  • Je veux que les obstacles à commencer à pirater sur cet outil pour être minime: personne ne devrait avoir à chasser pour la dépendance à droite dans la bonne version, ils devraient avoir à exécuter aussi peu que possible la configuration. Les conditions préalables au mieux serait d'avoir une installation de Python et juste vérifier le programme de Subversion.

Anecdote : Plus autonome le processus est plus il est facile de le répéter. J'ai eu ma machine a troqué pour un nouveau et est passé par le processus désagréable d'avoir à l'ingénierie inverse les dépendances, réinstaller distutils, la chasse aux bibliothèques en ligne et de les amener à installer (voir ci-dessus les restrictions d'Internet d'entreprise).

Était-ce utile?

La solution

J'utilise parfois l'approche que je décris ci-dessous, pour exactement la même raison que @Boris déclare: Je préférerais que l'utilisation d'un code est aussi facile que a) la caisse svn / mise à jour - b) aller

.

Mais pour l'enregistrement:

  • J'utilise virtualenv / easy_install la plupart du temps.
  • Je suis d'accord dans une certaine mesure aux critisisms par @Ali A et @ S. Lott

Quoi qu'il en soit, l'approche que je l'utilise dépend de la modification sys.path et fonctionne comme ceci:

  • Exiger python et setuptools (pour activer le code de chargement à partir d'oeufs) sur tous les ordinateurs qui utiliseront votre logiciel.
  • Organiser votre structure de répertoire ceci:
project/
    *.py
    scriptcustomize.py
    file.pth

    thirdparty/
        eggs/
            mako-vNNN.egg
            ... .egg
        code/
            elementtree\
                *.py
            ...
  • Dans votre script de haut niveau (s) comprennent le code suivant en haut:
from scriptcustomize import apply_pth_files
apply_pth_files(__file__)
  • Ajoutez scriptcustomize.py à votre dossier de projet:
import os
from glob import glob
import fileinput
import sys

def apply_pth_files(scriptfilename, at_beginning=False):
    """At the top of your script:
    from scriptcustomize import apply_pth_files
    apply_pth_files(__file__)

    """
    directory = os.path.dirname(scriptfilename)
    files = glob(os.path.join(directory, '*.pth'))
    if not files:
        return
    for line in fileinput.input(files):
        line = line.strip()
        if line and line[0] != '#':
            path = os.path.join(directory, line)
            if at_beginning:
                sys.path.insert(0, path)
            else:
                sys.path.append(path)
  • Ajoutez un ou plusieurs fichier * .pth (s) dans votre dossier de projet. Sur chaque ligne, mettre une référence à un répertoire avec des paquets. Par exemple:
# contents of *.pth file
thirdparty/code
thirdparty/eggs/mako-vNNN.egg
  • I « de type de » comme cette approche. Ce que j'aime: il est similaire à la façon dont les fichiers * .pth travail, mais pour les programmes individuels au lieu de votre site-packages entiers. Ce que je n'aime pas:. Devoir ajouter les deux lignes au début des scripts de haut niveau
  • Encore une fois: J'utilise virtualenv la plupart du temps. Mais je tendance à utiliser virtualenv pour les projets où j'ai un contrôle serré du scénario de déploiement. Dans le cas où je ne dispose pas de contrôle serré, je tends à utiliser l'approche que je décris ci-dessus. Il est vraiment facile à emballer un projet comme un zip et que l'utilisateur final « installer » il (en décompressant).

Autres conseils

Il suffit d'utiliser virtualenv - il est un outil pour créer des environnements isolés Python. Vous pouvez créer un script set-up et de distribuer tout le groupe si vous voulez.

« Je déteste le fait que les développeurs (ou moi à partir d'une nouvelle machine propre) à sauter à travers les cerceaux distutils d'avoir à installer les bibliothèques localement avant de pouvoir commencer »

Pourquoi?

Qu'est-ce que - en particulier - est le problème avec cette

Vous l'avez fait pour créer le projet. Votre projet est donc d'autres populaires veulent faire la même chose.

Je ne vois pas de problème. S'il vous plaît mettre à jour votre question avec des problèmes spécifiques que vous devez résoudre. Détestant la voie open source est distribué est pas un problème -. C'est la façon qui fonctionne open source

Modifier . Le « jardin clos » n'a pas beaucoup d'importance.

Choix 1. Vous pouvez, BTW, construire un "installateur" qui fonctionne easy_install 6 fois pour eux.

Choix 2. Vous pouvez enregistrer tous les kits d'installation qui easy_install aurait utilisé. Ensuite, vous pouvez fournir un script qui fait un Décompressez et un python setup.py install pour les six.

Choix 3. Vous pouvez fournir une version compressée de votre site-packages. Après l'installation de Python, ils décompressez votre répertoire site-packages dans `C:. \ Python2.5 \ lib \ site packages``

Choix 4. Vous pouvez construire votre propre kit d'installation MSI pour votre environnement Python.

Choix 5. Vous pouvez héberger votre propre serveur comme pypi et fournir un easy_install qui vérifie d'abord votre serveur.

Je suis d'accord avec les réponses par Nosklo et S. Lott. (1 à la fois)

Puis-je ajouter que ce que vous voulez faire est en fait une idée terrible .

Si vous voulez vraiment les gens à pirater votre code, ils auront besoin d'une compréhension des bibliothèques impliquées, comment ils fonctionnent, ce qu'ils sont, d'où ils viennent, la documentation pour chaque etc. Bien sûr, leur fournir un script d'amorçage , mais au-delà, vous serez molly-choyant au point qu'ils sont désemparés.

Ensuite, il y a des questions spécifiques telles que « si un utilisateur souhaite installer une autre version ou la mise en œuvre d'une bibliothèque? », Un exemple flagrant est ici ElementTree, car cela a un certain nombre de mises en œuvre.

Je ne suggère pas que c'est une excellente idée, mais en général ce que je fais dans des situations comme celles-ci est que j'ai un Makefile, vérifié dans la subversion, qui contient des règles pour récupérer toutes les bibliothèques dépendantes et les installer. Le makefile peut être assez intelligent pour appliquer uniquement les bibliothèques dépendantes si elles ne sont pas présents, donc cela peut être relativement rapide.

Un nouveau développeur sur le projet vérifie simplement de la subversion et les types « faire ».

Cette approche pourrait bien fonctionner pour vous, étant donné que votre public est déjà à l'idée d'utiliser subversion comme checkouts cadre de leur processus d'extraction. En outre, il a la propriété belle que toutes les connaissances au sujet de votre programme, y compris ses dépendances externes, sont capturées dans le référentiel de code source.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top