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.
Für Python 3.5+ verwenden Sie ( docs ):
import importlib.util
spec = importlib.util.spec_from_file_location("module.name", "/path/to/file.py")
foo = importlib.util.module_from_spec(spec)
spec.loader.exec_module(foo)
foo.MyClass()
Für Python 3.3 und 3.4 verwenden:
from importlib.machinery import SourceFileLoader
foo = SourceFileLoader("module.name", "/path/to/file.py").load_module()
foo.MyClass()
(Obwohl dies in Python 3.4 veraltet ist).
Für Python 2 verwenden:
import imp
foo = imp.load_source('module.name', '/path/to/file.py')
foo.MyClass()
Für kompilierte Python-Dateien und DLLs gibt es entsprechende Komfortfunktionen.
Siehe auch http://bugs.python.org/issue21436 .
Der Vorteil des Hinzufügens eines Pfades zu sys.path (gegenüber der Verwendung von imp) ist, dass es die Dinge vereinfacht, wenn mehr als ein Modul aus einem einzigen Paket importiert wird. Zum Beispiel:
import sys
# the mock-0.3.1 dir contains testcase.py, testutils.py & mock.py
sys.path.append('/foo/bar/mock-0.3.1')
from testcase import TestCase
from testutils import RunTests
from mock import Mock, sentinel, patch
Um Ihr Modul zu importieren, müssen Sie sein Verzeichnis in die Umgebungsvariable aufnehmen, entweder vorübergehend oder dauerhaft.
import sys
sys.path.append("/path/to/my/modules/")
import my_module
Fügen Sie die folgende Zeile zu Ihrem .bashrc
(oder alternative) Datei unter Linux und führen Sie aus source ~/.bashrc
(oder alternativ) in das Terminal ein:
export PYTHONPATH="${PYTHONPATH}:/path/to/my/modules/"
Kredit/Quelle: saarrrr , eine weitere Stack Exchange Frage
Wenn Ihr Top-Level-Modul keine Datei ist, sondern als Verzeichnis mit __init__.py verpackt ist, dann funktioniert die akzeptierte Lösung fast, aber nicht ganz. In Python 3.5+ wird der folgende Code benötigt (beachten Sie die hinzugefügte Zeile, die mit "sys.modules" beginnt):
MODULE_PATH = "/path/to/your/module/__init__.py"
MODULE_NAME = "mymodule"
import importlib
import sys
spec = importlib.util.spec_from_file_location(MODULE_NAME, MODULE_PATH)
module = importlib.util.module_from_spec(spec)
sys.modules[spec.name] = module
spec.loader.exec_module(module)
Ohne diese Zeile wird bei der Ausführung von exec_module versucht, die relativen Importe in der __init__.py der obersten Ebene an den Modulnamen der obersten Ebene zu binden - in diesem Fall "mymodule". Aber "mymodule" ist noch nicht geladen, so dass Sie den Fehler "SystemError: Parent module 'mymodule' not loaded, cannot perform relative import". Sie müssen also den Namen binden, bevor Sie ihn laden. Der Grund dafür ist die grundlegende Invariante des relativen Importsystems: "Die Invariante besagt, dass, wenn Sie sys.modules['spam'] und sys.modules['spam.foo'] haben (wie nach dem obigen Import), letzteres als das foo-Attribut des ersteren erscheinen muss. wie hier besprochen .
Es hört sich so an, als ob Sie nicht speziell die Konfigurationsdatei importieren wollen (was eine ganze Reihe von Nebeneffekten und zusätzlichen Komplikationen mit sich bringt). Sie wollen sie einfach nur ausführen und auf den resultierenden Namespace zugreifen können. Die Standardbibliothek bietet eine API speziell für diesen Zweck in Form von runpy.run_path :
from runpy import run_path
settings = run_path("/path/to/file.py")
Diese Schnittstelle ist in Python 2.7 und Python 3.2+ verfügbar.
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.