2009-10-19 13 views
5

Wir haben eine Python-Bibliothek, die wir entwickeln. Während der Entwicklung möchte ich einige Teile dieser Bibliothek verwenden, um die neueren Versionen zu testen. Verwenden Sie den stabilen Code, um den Entwicklungscode zu testen. Gibt es eine Möglichkeit, dies in Python zu tun?Verschiedene Versionen einer Python-Bibliothek im selben Prozess verwenden

Bearbeiten: Um genauer zu sein, haben wir eine Bibliothek (LibA), die viele nützliche Dinge hat. Außerdem haben wir eine Testbibliothek, die LibA verwendet, um einige Testmöglichkeiten (LibT) zur Verfügung zu stellen. Wir wollen LibA mit LibT testen, aber da LibT von LibA abhängt, würden wir lieber eine stabile Version von LibA verwenden, während wir LibT testen (weil wir LibT nur dann ändern werden, wenn erst nach dem Bestehen von Tests mit neueren LibA gearbeitet wird). Beim Ausführen von Komponententests werden LibA-dev-Tests LibT-Code verwenden, der von LibA-stable abhängt.

Eine Idee, die wir uns ausgedacht haben, ist der Aufruf des stabilen Codes mit RPyC in einem anderen Prozess, aber es ist schwierig, sie luftdicht zu implementieren (um sicherzustellen, dass sie korrekt stirbt usw.) und mehrere Instanzen ausführen können zur selben Zeit am selben Computer usw.).

Dank

+1

Warum können Sie Ihre normalen Quellcodeverwaltungstools nicht verwenden, um die gewünschte Konfiguration von stabilem und Entwicklungscode zu erstellen? Alle anderen machen das in SVN mit Filialen. Und keine Programmierung. Warum können Sie SVN-Zweige nicht verwenden, um dies zu tun? –

+1

Konnte nicht sehen, was Branching damit zu tun hat, also machte ich die Frage ein wenig klarer, in der Hoffnung, dass es Ihnen helfen wird zu verstehen, was ich versuche zu tun. – abyx

Antwort

0

Ich bin nicht sicher, wie genau Sie benötigen, um Ihre Tests einzurichten, aber Sie können in der Lage sein VirtualEnv verwenden beide Instanzen neben einander laufen zu bekommen.

+0

Es ist nicht neben, man muss tatsächlich die andere verwenden. – abyx

1

Wenn Sie libA-dev mit libT "testen", was von libA (stable) abhängt, dann testen Sie libA-dev nicht so, wie es sich in einer Produktionsumgebung verhalten würde. Die einzige Möglichkeit, libA-dev wirklich zu testen, ist, den vollen Sprung zu wagen und libT von libA-dev abhängig zu machen. Wenn das Ihre Unit Tests bricht, dann ist das eine gute Sache - es zeigt Ihnen, was repariert werden muss.

Wenn Sie keine Komponententests haben, dann ist es an der Zeit, sie zu erstellen (indem Sie zuerst stable libA und libT verwenden!).

Ich empfehle die Verwendung eines "Versionskontrollsystems" (z. B. bzr, hg, svn, git). Dann könntest du Zweige deines Projektes machen, "stabil" und "devA".

auf Zweig Deva arbeiten zu können, zuerst

export PYTHONPATH=/path/to/devA 

Indem sicher, dass die Umgebungsvariable PYTHONPATH schließt die anderen Zweige laufen würde, sind Sie sicher sein, Python nutzt nur die Module, die Sie wünschen.

Wenn es Zeit wird, Code von dev -> stable zu verschmelzen, wird die Versionskontrollsoftware eine einfache Möglichkeit bieten, dies auch zu tun.

Versionskontrolle ermöglicht es Ihnen auch, mutiger zu sein - größere Änderungen zu versuchen ist nicht so beängstigend. Wenn es nicht klappt, ist das Zurücksetzen super einfach. Zwischen diesem und dem PYTHONPATH-Trick können Sie immer wieder zu bekanntem funktionierendem Code zurückkehren.

Wenn Sie glauben, dass das oben Genannte einfach nicht funktioniert und Sie libT-was-abhängig-von-libA benötigt, um libA-dev zu testen, dann müssen Sie alle Module umbenennen und modifizieren alle Importanweisungen, um eine klare Trennung zwischen libA-dev und libA zu erreichen. Wenn beispielsweise libA ein Modul mit dem Namen moduleA.py hat, benennen Sie es in moduleA_dev.py um.

Der Befehl

rename -n 's/^(.*)\.py/$1_dev.py/' *.py 

wird "_dev" an alle * .py Dateien hinzufügen. (Mit dem "-n" -Flag wird der Umbenennungsbefehl nur die beabsichtigte Umbenennung anzeigen. Entfernen Sie das "-n", um es tatsächlich zu durchlaufen.)

die Umbenennung rückgängig laufen

rename -n 's/^(.*)_dev\.py/$1.py/' *.py 

Weiter Sie alle Verweise auf moduleA zu moduleA_dev im Code ändern müssen. > "ModuleA_dev" - Der Befehl

find /path/to/LibA-dev/ -type f -name '*.py' -exec sed -i 's/moduleA/moduleA_dev/g' {} \; 

wird jede * .py Datei in Liba-dev, Ändern "moduleA" ändern.

Seien Sie vorsichtig mit diesem Befehl. Es ist gefährlich, denn wenn Sie eine Variable mit dem Namen moduleAB haben, wird sie in moduleA_devB umbenannt, während Sie eigentlich moduleAB_dev haben wollen.

Um diese Änderung (vorbehaltlich der oben Vorbehalt) zurückzukehren,

find /path/to/LibA-dev/ -type f -name '*.py' -exec sed -i 's/moduleA_dev/moduleA/g' {} \; 

Sobald Sie die Namensräume zu trennen, können Sie die zirkuläre Abhängigkeit gebrochen haben. Sobald Sie zufrieden sind, ist Ihr libA-dev gut, Sie könnten moduleA_dev.py ändern -> moduleA.py und ändert alle Verweise auf moduleA_dev -> moduleA in Ihrem Code.

+0

Aber es sind verschiedene Projekte, welche Bedeutung hat LibAT? LibT möchte eine stabile Version von LibA verwenden und das ist es. Ich möchte nie die Dev-Version von LibT mit anderem Code verwenden, nur stabile LibT mit stabiler LibA, um dev-LibA zu testen – abyx

+0

Ich habe meine Antwort bearbeitet, um hoffentlich besser auf deine Situation einzugehen. – unutbu

1

„Wir wollen Liba mit libt testen, sondern weil libt auf Liba abhängt, würden wir es eher eine stabile Version von Liba, verwenden, während der Prüfung libt“

Es macht keinen Sinn T zu verwenden, + A, um A zu testen. Was sinnvoll ist, ist das Folgende.

LibA ist wirklich zwei Dinge zusammen gestampft: A1 und A2.

T hängt von A1 ab.

Was wirklich passiert ist, dass Sie A2 aktualisieren und testen, mit T und A1.

Wenn Sie LibA in die Teile, die T erfordert, und die anderen Teile zerlegen, können Sie diese zirkuläre Abhängigkeit möglicherweise aufheben.

Verwandte Themen