2016-08-17 1 views
0

Projektstruktur:Lokalisierung Projekt-specifc Konfigurationsdateien aus importierter Module

/lib/modules/mod1.py 
/mod2.py 
/subdir1/subdir2/mod3.py 
/configs/config.yaml 

mod3.py Importe mod2.py. mod2.py Importe mod1.py. mod1.py lädt Konfigurationsdateien, die einen relativen Pfad zu mod2.py mit os.getcwd() haben.

Das Problem ist, dass, wenn mod3.py Einfuhren mod2.py, mod1.py Versuche, die Konfigurationsdateien von einem Pfad relativ zu mod3.py (dh /subdir1/subdir2/configs/config.yaml anstelle von /configs/config.yaml)--this zu laden funktioniert natürlich nicht.

Ich glaube zu verstehen, warum dies nicht funktioniert (os.getcwd() erhalten Sie den Pfad der ursprünglich ausgeführten Datei).

Wie kann ich dieses Problem beheben, so dass mod1.py einen Pfad relativ zum mod2.py nutzen will, auch wenn mod2.py von mod3.py importiert wird?

+0

Vielleicht wäre das Umschreiben des Codes, um das Laden von Dateien von relativen Standorten zu vermeiden, die beste Option, aber wenn Sie müssen, werfen Sie einen Blick auf 'mod2 .__ file__' ... – twalberg

+0

Das Problem ist, dass der Speicherort von' mod2.py' Diese variieren je nach Projekt, aber die Dateien innerhalb des Projekts folgen immer einem relativen Pfad. In diesem Beispiel wird 'mod1.py' aus der Projektstruktur geladen - aber wenn diese von einem Speicherort außerhalb der Projektstruktur geladen wurde, würde der Speicherort von' mod2.py' verwendet werden, um den Speicherort von config.yaml festzulegen . – user2487593

Antwort

0

Ich habe nicht in der Lage gewesen, eine integrierte Möglichkeit zu finden, dies in Python zu tun, also, was ich tun endete, ist dies:

mod1.py: 
configs_list = os.getcwd().split('/') 
for x in configs_list: 
    # Check each directory in list, bottom up. 'pop()' list on 
    # each failure. Assign var and break loop when configs path is found. 
    if not os.path.exists('/'.join(configs_list) + '/configs'): 
     configs_list.pop() 
    else: 
     configs_path = '/'.join(configs_list) + '/configs' 
     break 

configs_path wird dann verwendet, um die spezifischen Konfiguration Dateinamen voranstellen (s) in mod1.py. Da jeder Aufruf von mod1.py aus der Verzeichnisstruktur eines Projekts erfolgt und jedes Projekt nur ein Verzeichnis configs hat, sollte das Verzeichnis configs (und bisher) korrekt identifiziert werden, unabhängig davon, wo im Projekt das angegebene Skript ausgeführt wird.

Ich bin offen für bessere oder mehr Pythonic Möglichkeiten, dies zu tun, wenn jemand Input hat.

Verwandte Themen