2010-06-25 4 views
18

Je suis actuellement en train de gérer deux de mes propres applications. Ils partagent tous deux des aspects communs et, par conséquent, partagent du code. Jusqu'à présent, je viens de copier les modules d'un projet à l'autre, mais maintenant cela devient un problème de maintenance. Je préférerais avoir le code commun à un endroit, en dehors des deux projets, qu'ils peuvent importer tous les deux. Ensuite, tout changement au code commun serait reflété dans les deux projets.Comment puis-je utiliser du code commun en python?

Ma question est: comment puis-je faire cela? Est-ce que je crée une bibliothèque avec ce code? Si oui, comment les projets dépendants utilisent-ils la bibliothèque? Je pense qu'une chose avec laquelle je me bats ici est que le code commun n'est vraiment utile à personne d'autre, ou du moins, je ne veux pas en faire un module supporté que d'autres personnes peuvent utiliser.

Si ma question n'est pas claire, s'il vous plaît faites le moi savoir.

Répondre

18

Il n'y a rien de spécial que vous ayez à faire, Python a juste besoin de trouver votre module. Cela signifie que vous devez mettre votre module commun dans votre PYTHONPATH, ou vous pouvez ajouter leur emplacement à sys.path. See this.

Supposons que vous avez

~/python/project1 
~/python/project2 
~/python/libs/stuff.py 
~/python/libs/other.py 

Vous pouvez définir PYTHONPATH='~/python/libs' dans votre os ambience, ou vous pouvez faire

import sys, os 
sys.path.append(os.path.expanduser('~/python/libs')) # or give the full path 

Après cela, vous pouvez le faire import stuff, other partout.

Vous pouvez également emballer vos affaires, alors vous avez besoin d'une mise en page comme ceci:

~/python/project1 
~/python/project2 
~/python/libs/mylibname/__init__.py 
~/python/libs/mylibname/stuff.py 
~/python/libs/mylibname/other.py 

~/python/libs/mylibname/__init__.py doit exister, mais il peut être un fichier vide. Il devient mylibname en package. Après avoir ajouté le dossier libs à votre chemin d'accès comme ci-dessus, vous pouvez le faire en .

+0

Cela semble très simple. Donc, j'ai mes projets sur le disque comme ceci: - Projets - Projet 1 - Projet 2 - Common donc 'commune' irait dans 'PYTHONPATH'? Cela signifie-t-il que setup.py doit également définir 'PYTHONPATH'? Enfin, que puis-je appeler le code commun? Je m'inquiète que 'import common.something' n'est pas très instructif. Peut-être que je m'inquiète pour les petites choses. – Jon

+0

merci! facile et fonctionne – Oyiwai

3

Il y a beaucoup de façons de factoriser le code pour qu'il soit réutilisable. Cela dépend vraiment de votre situation spécifique dans la mesure où ce qui fonctionne le mieux. Factoriser votre code en paquets et modules distincts est toujours une bonne idée, donc le code associé reste groupé et peut être réutilisé à partir d'autres paquets et modules. Factoriser votre code en classes dans un module peut également aider à garder le code lié ensemble. Je dirais que mettre le code commun dans un module ou un paquet qui est sur votre PYTHONPATH et disponible pour les deux applications serait probablement votre meilleure solution.

0

Voilà comment je le ferais:

  • faire une archive EGG de votre projet commun:

    ~:zip common.egg common 
    
  • font la partie du fichier d'œufs de vos bibliothèques

    cp common.egg PROJECT_PATH/lib/ 
    
  • dans vos projets:

    import glob 
    import os 
    
    def main(): 
        path_lib=os.path.abspath(os.path.split(os.path.abspath(sys.modules['__main__'].__file__))[0] + '/../lib') 
        sys.path += glob.glob(path_lib + '/*.egg') 
        from common import stuff 
        stuff.doCommonStuff() 
    
Questions connexes