1793 Stimmen

Wie importiere ich ein Modul unter Angabe des vollständigen Pfads?

Wie lade ich ein Python-Modul mit seinem vollständigen Pfad?

Beachten Sie, dass die Datei überall im Dateisystem liegen kann.

25voto

ctcherry Punkte 27220

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

22voto

Mad Physicist Punkte 93794

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.

19voto

ジョージ Punkte 1296

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.

18voto

sorin Punkte 147675

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.

17voto

Wheat Punkte 827

Meinen Sie laden oder importieren?

Sie können die sys.path geben Sie den Pfad zu Ihrem Modul an, und importieren Sie Ihr Modul. Zum Beispiel, wenn ein Modul unter:

/foo/bar.py

Das könnten Sie tun:

import sys
sys.path[0:0] = ['/foo'] # Puts the /foo directory at the start of your path
import bar

CodeJaeger.com

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.

Powered by:

X