Import von beliebigen python-Quellcode-Datei. (Python 3.3+)
Wie kann ich importieren eine beliebige python-source-Datei (deren Dateiname könnte beliebige Zeichen enthalten, und nicht immer endet mit .py
) in Python 3.3+?
Ich verwendet imp.load_module
wie folgt:
>>> import imp
>>> path = '/tmp/a-b.txt'
>>> with open(path, 'U') as f:
... mod = imp.load_module('a_b', f, path, ('.py', 'U', imp.PY_SOURCE))
...
>>> mod
<module 'a_b' from '/tmp/a-b.txt'>
Es funktioniert immer noch in Python 3.3, aber nach imp.load_module
Dokumentation, es ist veraltet:
Veraltet seit version 3.3: nicht Benötigte als Lader verwendet werden sollte, um
Module laden und find_module() ist veraltet.
sowie imp
Modul-Dokumentation empfiehlt importlib
:
Hinweis Neue Programme verwenden sollten importlib anstatt dieses Moduls.
Was ist der richtige Weg, um laden eines beliebigen python-source-Datei in Python 3.3+ ohne Verwendung des veralteten imp.load_module
Funktion?
- Darf ich Fragen, warum Sie dies tun? Ich bin der maintainer von importlib und ich habe versucht, Antworten zu bekommen von Leuten, warum Sie verwenden
imp.load_module()
über eine gerade import-Anweisung. Erwarten Sie das Modul importieren von Namen zu einem späteren Zeitpunkt (z.B.import a_b
)? Haben Sie Sorge, dass alle benutzerdefinierten Importeure nicht verwendet werden in diesem Ansatz? Erwarten Sie, dass die Modul-full-featured (z.B. definieren__name__
und__loader__
)? - Ein Drittanbieter-Programm regelmäßig (einmal pro Stunde) zu ändern, eine text-Datei, die enthält die python-Anweisungen (vor allem
THIS='blah'
wie Linien). Der name der Datei ist nicht zu Ende ist mit.py
. Mein Programm diese Datei Lesen,. - Ich bin mir nicht bewusst, benutzerdefinierte Importeure. I don ' T care, das Modul mit vollem Funktionsumfang.
- IOW mit Python als eine wirklich einfache Datenstruktur-format. Danke für die info!
- Können Sie erklären, warum?
- Ich lief nur in einem Fall, wo ich brauchte, um zu importieren, einige Python-code in ein Verzeichnis, das benannt wurde, als eine Versionsnummer (z.B. "v1.0.2"). Obwohl es möglich ist, wäre es höchst unerwünscht, um das Verzeichnis umbenennen. Ich aufgewickelt mit stefan-scherfke Lösung unten.
- Verwandte: stackoverflow.com/questions/2601047/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gefunden, die eine Lösung von
importlib
test-code.Mit importlib.Maschinen.SourceFileLoader:
HINWEIS: funktioniert nur in Python 3.3+.
UPDATE
Loader.load_module
ist veraltet, da Python 3.4. VerwendenLoader.exec_module
statt:load_module
ignoriert überwarnings.catch_warnings
. Wenn Sie stattdessenmod = imp.load_source('a_b', '/tmp/a-b.txt')
es stellt sich die folgende Warnung (verwenden Sie-Wall
):DeprecationWarning: imp.load_source() is deprecated; use importlib.machinery.SourceFileLoader(name, pathname).load_module() instead
.SourceFileLoader
versteht nur Reine Python-source-Module. Für die be-extension-Module (.so / .dll-Dateien) mit einem beliebigen suffix, Geschwister-KlasseExtensionFileLoader
ist der Weg zu gehen 🙂Kürzere version von @falsetru 's Lösung:
Getestet habe ich es mit Python 3.5 und 3.6.
Laut den Kommentaren funktioniert es nicht mit beliebigen Datei-Erweiterungen.
importlib.util.spec_from_file_location(..)
zurückNone
für mich, was eine Ausnahme für die folgendenimportlib.util.module_from_spec(..)
nennen. (Siehe i.imgur.com/ZjyFhif.png)importlib.util.spec_from_file_location
arbeitet für bekannte Datei-Namen-Erweiterungen (.py
,.so
, ..), aber nicht für andere (.txt
...)Ähnlich wie @falsetru aber für Python 3.5+ - und Rechnungswesen für das, was die
importlib
doc Staaten mitimportlib.util.module_from_spec
übertypes.ModuleType
:Sind wir in der Lage zu importieren eine Datei mit
importlib
allein durch ändern derimportlib.machinery.SOURCE_SUFFIXES
Liste.importlib.machinery.EXTENSION_SUFFIXES.append('')
macht immer nochimportlib.util.spec_from_file_location
Gegenzug Keine.importlib.util.spec_from_file_location
sollte trotzdem funktionieren, mit Erweiterungen, wenn Sie ein loader -