mutetella hat geschrieben:Allerdings greift ja auch innerhalb von virtualenv das Skript auf meinen tatsächlichen home-Ordner zu. Wie kann ich das verhindern?
Da ich mich mit virtualenv nicht auskenne, kann ich Dir nur einen konventionellen Tipp geben: Wende das
Strategie-Muster an! Offenbar bist Du in einer Situation, in der der Ort der Daten
oder sogar die Daten selber relevant sind. An der Stelle musst Du ansetzen:
Mache den Mechanismus derartig flexibel, dass Du die Datei z.B. als Parameter übergeben kannst. Nun musst Du an der aufrufenden Stelle natürlich noch wissen, welcher Pfad denn nun gewählt werden soll. Das könntest Du z.B. über einen Kommandozeilenparameter beim Start hinterlegen. Du könntest bei einem optionalen Parameter ja einen default Pfad angeben, so dass man im späteren Betrieb auf den Parameter verzichten kann und diesen nur in der Testumgebung angeben muss.
Evtl. ist es aber sogar noch eleganter, die Daten, die Du bisher nur aus der Config-Datei beziehst, so zu abstrahieren, dass sie auch aus anderer Quelle stammen können. An der Stelle, an der die Daten beschafft werden, muss nun abhängig von einem Parameter entschieden werden, ob diese aus der Config-Datei geladen oder als "Fake"-Daten irgend wo aus dem Quellcode stammen. In Python könnte man dafür sogar ein Modul schreiben, welches nur dann importiert wird, wenn man den Test-Weg beschreitet. Die Info über die Entscheidung muss natürlich auch bei dieser Variante irgend wie ins Programm kommen, evtl. also auch über einen booleschen Schalter bei Programmstart.
Dieser Ansatz hat den Charme und Vorteil gegenüber der ersten Variante, dass Du die aufrufende Stelle mittels Unittest testen kannst; das geht bei der anderen Variante naturgemäß nicht, da Du dort *immer* auf das Dateisystem zugreifst.
(Und: Der Link oben dient nur der Vollständigkeit; imho ist der Strategy-Pattern in Python oft extrem trivial zu implementieren; da braucht es keine wilden Klassen basierten Auswüchse, eben weil Python Funktionen höherer Ordnung hat, oder auch Lambdas oder allgemein "Callables". Aber auch ein simple ``if... else``-Weiche geht imho genau in die Richtung, sofern es um die "Datenbeschaffung" geht und man unabhängig des Weges danach auf derselben Datenstruktur arbeitet.)