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.

2voto

Andrei Keino Punkte 81

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.

2voto

David Punkte 611

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()

2voto

user2760152 Punkte 33

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 *

1voto

Benos Punkte 556

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

0voto

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.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