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.
Ein ganz einfacher Weg: Angenommen, Sie wollen eine Datei mit dem relativen Pfad ../../MyLibs/pyfunc.py importieren
libPath = '../../MyLibs'
import sys
if not libPath in sys.path: sys.path.append(libPath)
import pyfunc as pf
Aber wenn man es ohne einen Wächter schafft, kann man schließlich einen sehr langen Weg bekommen.
Dies wird den Import von kompilierten (pyd) Python-Modulen in 3.4 ermöglichen:
import sys
import importlib.machinery
def load_module(name, filename):
# If the Loader finds the module name in this list it will use
# module_name.__file__ instead so we need to delete it here
if name in sys.modules:
del sys.modules[name]
loader = importlib.machinery.ExtensionFileLoader(name, filename)
module = loader.load_module()
locals()[name] = module
globals()[name] = module
load_module('something', r'C:\Path\To\something.pyd')
something.do_something()
Unter Linux funktioniert das Hinzufügen eines symbolischen Links in das Verzeichnis, in dem sich Ihr Python-Skript befindet.
D.h.:
ln -s /absolute/path/to/module/module.py /absolute/path/to/script/module.py
Der Python-Interpreter erstellt /absolute/path/to/script/module.pyc
und aktualisiert es, wenn Sie den Inhalt von /absolute/path/to/module/module.py
.
Dann fügen Sie Folgendes in die Datei ein mypythonscript.py :
from module import *
Dies sind meine beiden Hilfsfunktionen, die nur pathlib verwenden. Sie leitet den Modulnamen aus dem Pfad ab.
Standardmäßig lädt es rekursiv alle Python-Dateien aus Ordnern und ersetzt init .py durch den Namen des übergeordneten Ordners. Sie können aber auch einen Pfad und/oder ein glob angeben, um bestimmte Dateien auszuwählen.
from pathlib import Path
from importlib.util import spec_from_file_location, module_from_spec
from typing import Optional
def get_module_from_path(path: Path, relative_to: Optional[Path] = None):
if not relative_to:
relative_to = Path.cwd()
abs_path = path.absolute()
relative_path = abs_path.relative_to(relative_to.absolute())
if relative_path.name == "__init__.py":
relative_path = relative_path.parent
module_name = ".".join(relative_path.with_suffix("").parts)
mod = module_from_spec(spec_from_file_location(module_name, path))
return mod
def get_modules_from_folder(folder: Optional[Path] = None, glob_str: str = "*/**/*.py"):
if not folder:
folder = Path(".")
mod_list = []
for file_path in sorted(folder.glob(glob_str)):
mod_list.append(get_module_from_path(file_path))
return mod_list
Diese Antwort ist eine Ergänzung zu Sebastian Rittau's Antwort auf den Kommentar zu antworten: "Aber was ist, wenn Sie den Modulnamen nicht haben?" Dies ist ein schneller und schmutziger Weg, um den wahrscheinlichen Namen eines Python-Moduls bei einem Dateinamen zu erhalten -- es geht einfach den Baum hoch, bis es ein Verzeichnis ohne einen __init__.py
Datei und verwandelt sie dann wieder in einen Dateinamen. Für Python 3.4+ (verwendet pathlib), was Sinn macht, da Python 2-Benutzer "imp" oder andere Möglichkeiten für relative Importe verwenden können:
import pathlib
def likely_python_module(filename):
'''
Given a filename or Path, return the "likely" python module name. That is, iterate
the parent directories until it doesn't contain an __init__.py file.
:rtype: str
'''
p = pathlib.Path(filename).resolve()
paths = []
if p.name != '__init__.py':
paths.append(p.stem)
while True:
p = p.parent
if not p:
break
if not p.is_dir():
break
inits = [f for f in p.iterdir() if f.name == '__init__.py']
if not inits:
break
paths.append(p.stem)
return '.'.join(reversed(paths))
Es gibt sicherlich Verbesserungsmöglichkeiten, und die optionale __init__.py
Dateien könnten andere Änderungen erforderlich machen, aber wenn Sie die __init__.py
Im Allgemeinen ist das der richtige Weg.
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.