2010-06-25 3 views
18

Ich führe gerade zwei meiner eigenen Anwendungen. Sie teilen einige gemeinsame Aspekte und teilen daher Code. Bis jetzt habe ich nur die Module von einem Projekt zum anderen kopiert, aber jetzt wird es ein Wartungsproblem. Ich hätte lieber den gemeinsamen Code an einem Ort, außerhalb der beiden Projekte, die beide importiert werden können. Dann würden sich Änderungen am gemeinsamen Code in beiden Projekten widerspiegeln.Wie kann ich gemeinsamen Code in Python verwenden?

Meine Frage ist: wie kann ich das tun? Erstelle ich eine Bibliothek aus diesem Code? Wenn ja, wie nutzen die abhängigen Projekte die Bibliothek? Ich denke, eine Sache, mit der ich hier zu kämpfen habe, ist, dass der gemeinsame Code für niemanden wirklich nützlich ist, oder zumindest möchte ich es nicht zu einem unterstützten Modul machen, das andere Leute benutzen können.

Wenn meine Frage nicht klar ist, lass es mich wissen.

Antwort

18

Es gibt nichts Besonderes, das Sie tun müssen, Python muss nur Ihr Modul finden. Das bedeutet, dass Sie Ihr gemeinsames Modul in Ihre PYTHONPATH oder Ihren Standort zu sys.path hinzufügen müssen. See this.

Sagen Sie bitte

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

Sie haben entweder PYTHONPATH='~/python/libs' in Ihrem os Umgebung einstellen können, oder Sie können Sie import stuff, other überall tun können Danach

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

tun.

Sie auch Ihre Sachen packen können, dann müssen Sie ein Layout wie folgt aus:

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

~/python/libs/mylibname/__init__.py muss vorhanden sein, aber es kann eine leere Datei sein. Es wird mylibname in eine package.

Nach dem Hinzufügen des libs-Ordners zu Ihrem Pfad wie oben, können Sie from mylibname import stuff, other tun.

+0

Das klingt sehr einfach. Also, ich habe meine Projekte auf der Festplatte wie folgt: - Projekte - Projekt 1 - Projekt 2 - Gemeinsame So 'Allgemein' in 'PYTHONPATH' gehen würde? Bedeutet das, dass setup.py auch 'PYTHONPATH' einstellen muss? Was kann ich schließlich den gemeinsamen Code nennen? Ich mache mir Sorgen, dass "Import common.something" nicht sehr informativ ist. Vielleicht mache ich mir Sorgen um kleine Dinge. – Jon

+0

danke! einfach und funktioniert – Oyiwai

3

Es gibt viele Möglichkeiten, den Code zu faktorisieren, so dass er wiederverwendbar ist. Es hängt wirklich von Ihrer spezifischen Situation ab, was am besten funktioniert. Es ist immer eine gute Idee, den Code in separate Pakete und Module zu zerlegen, damit der zugehörige Code gebündelt bleibt und aus anderen Paketen und Modulen wiederverwendet werden kann. Das Einbeziehen Ihres Codes in Klassen innerhalb eines Moduls kann auch dazu beitragen, den zugehörigen Code in Gruppen zusammenzufassen.

Ich würde sagen, dass gemeinsame Code in ein Modul oder ein Paket, das auf Ihrem PYTHONPATH und für beide Anwendungen verfügbar ist, wahrscheinlich Ihre beste Lösung wäre.

0

Hier ist, wie ich es tun würde:

  • ein Ei Archiv Ihrer gemeinsamen Projekt machen:

    ~:zip common.egg common 
    
  • das Ei Datei Teil Ihrer Bibliotheken machen

    cp common.egg PROJECT_PATH/lib/ 
    
  • in Ihren Projekten:

    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() 
    
Verwandte Themen