Wie lade ich ein Python-Modul mit seinem vollständigen Pfad?
Beachten Sie, dass die Datei überall im Dateisystem liegen kann.
Wie lade ich ein Python-Modul mit seinem vollständigen Pfad?
Beachten Sie, dass die Datei überall im Dateisystem liegen kann.
Sie können auch so vorgehen und das Verzeichnis, in dem sich die Konfigurationsdatei befindet, zum Python-Ladepfad hinzufügen und dann einfach einen normalen Import durchführen, vorausgesetzt, Sie kennen den Namen der Datei im Voraus, in diesem Fall "config".
Unübersichtlich, aber es funktioniert.
configfile = '~/config.py'
import os
import sys
sys.path.append(os.path.dirname(os.path.expanduser(configfile)))
import config
Ich habe mir eine leicht modifizierte Version von @SebastianRittau's wunderbare Antwort (für Python > 3.4, glaube ich), die es Ihnen ermöglicht, eine Datei mit einer beliebigen Erweiterung als Modul zu laden, indem Sie spec_from_loader
anstelle von spec_from_file_location
:
from importlib.util import spec_from_loader, module_from_spec
from importlib.machinery import SourceFileLoader
spec = spec_from_loader("module.name", SourceFileLoader("module.name", "/path/to/file.py"))
mod = module_from_spec(spec)
spec.loader.exec_module(mod)
Der Vorteil der Kodierung des Pfades in einer expliziten SourceFileLoader
ist, dass die Maschinenpark wird nicht versuchen, den Typ der Datei anhand der Erweiterung zu ermitteln. Das bedeutet, dass Sie etwas wie eine .txt
Datei mit dieser Methode zu erstellen, aber Sie könnten es nicht mit spec_from_file_location
ohne den Lader anzugeben, weil .txt
ist nicht in importlib.machinery.SOURCE_SUFFIXES
.
Ich habe eine Implementierung auf der Grundlage dieser, und @SamGrondahls nützliche Änderung in meine Dienstprogramm-Bibliothek, Haggis . Die Funktion heißt haggis.load.load_module
. Es fügt ein paar nette Tricks hinzu, wie die Möglichkeit, Variablen in den Modul-Namensraum zu injizieren, wenn es geladen wird.
Zur Ergänzung von Sebastian Rittau die Antwort: Zumindest für CPython gibt es pydoc und importiert Dateien, auch wenn dies nicht offiziell erklärt wird:
from pydoc import importfile
module = importfile('/path/to/module.py')
PS. Der Vollständigkeit halber ein Hinweis auf die derzeitige Umsetzung: pydoc.py und ich freue mich, sagen zu können, dass in der Art von xkcd 1987 es verwendet keine der in den folgenden Abschnitten genannten Implementierungen Ausgabe 21436 -- Zumindest nicht wörtlich.
Hier ist ein Code, der in allen Python-Versionen funktioniert, von 2.7-3.5 und wahrscheinlich auch in anderen.
config_file = "/tmp/config.py"
with open(config_file) as f:
code = compile(f.read(), config_file, 'exec')
exec(code, globals(), locals())
Ich habe es getestet. Es mag hässlich sein, aber bis jetzt ist es das einzige, das in allen Versionen funktioniert.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.