Ich habe einige Code, der eine Standard-Konfigurationsdatei lädt und ermöglicht dann die Benutzer ihre eigenen Python-Dateien als zusätzliche ergänzende Konfiguration oder überschreibt der Standardwerte liefern:Python: execfile aus dem Arbeitsverzeichnis der anderen Datei?
# foo.py
def load(cfg_path=None):
# load default configuration
exec(default_config)
# load user-specific configuration
if cfg_path:
execfile(cfg_path)
ist ein Problem gibt, aber: execfile()
führt Richtlinien die von cfg_path
angegebene Datei, als ob sie im Arbeitsverzeichnis von foo.py
wäre, nicht in einem eigenen Arbeitsverzeichnis. Daher können import
Direktiven möglicherweise fehlschlagen, wenn die cfg_path
-Datei beispielsweise from m import x
enthält, wobei m
ein Modul im selben Verzeichnis wie cfg_path
ist.
Wie kann ich execfile()
aus dem Arbeitsverzeichnis des Arguments oder sonst ein äquivalentes Ergebnis erzielen? Außerdem wurde mir gesagt, dass execfile
in Python 3 veraltet ist und dass ich exec
verwenden sollte. Wenn es also einen besseren Weg gibt, dass ich das tun sollte, bin ich ganz Ohr.
Hinweis: Ich glaube nicht, dass Lösungen, die nur das Arbeitsverzeichnis ändern, korrekt sind. Das wird diese Module nicht auf den Modul-Suchpfad des Interpreters bringen, soweit ich das beurteilen kann.
Danke für Ihre Antwort. Leider scheint das bei mir nicht zu funktionieren. 'execfile()' scheint einen völlig neuen Prozess mit einem eigenen Arbeitsverzeichnis zu starten, das nicht dasselbe ist wie das, von dem ich starte. –
Nein, @Kyle, 'execfile' startet keinen separaten Prozess und ** ** respektiert das aktuelle Arbeitsverzeichnis. Bearbeiten Sie meine Antwort, um ein einfaches Beispiel zu zeigen, dass Sie falsch liegen. –