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.

7voto

fny Punkte 27350

Es gibt eine Paket die speziell diesem Thema gewidmet ist:

from thesmuggler import smuggle

# À la `import weapons`
weapons = smuggle('weapons.py')

# À la `from contraband import drugs, alcohol`
drugs, alcohol = smuggle('drugs', 'alcohol', source='contraband.py')

# À la `from contraband import drugs as dope, alcohol as booze`
dope, booze = smuggle('drugs', 'alcohol', source='contraband.py')

Es ist für alle Python-Versionen getestet (auch für Jython und PyPy), aber je nach Größe Ihres Projekts könnte es zu viel sein.

7voto

abhimanyu Punkte 642

Python-Modul erstellen test.py :

import sys
sys.path.append("<project-path>/lib/")
from tes1 import Client1
from tes2 import Client2
import tes3

Python-Modul erstellen test_check.py :

from test import Client1
from test import Client2
from test import test3

Wir können das importierte Modul von module importieren.

5voto

Redlegjed Punkte 51

Dieser Bereich von Python 3.4 scheint extrem schwer zu verstehen zu sein! Doch mit ein wenig Hacking mit dem Code von Chris Calloway als Start habe ich es geschafft, etwas zu arbeiten. Hier ist die grundlegende Funktion.

def import_module_from_file(full_path_to_module):
    """
    Import a module given the full path/filename of the .py file

    Python 3.4

    """

    module = None

    try:

        # Get module name and path from full path
        module_dir, module_file = os.path.split(full_path_to_module)
        module_name, module_ext = os.path.splitext(module_file)

        # Get module "spec" from filename
        spec = importlib.util.spec_from_file_location(module_name,full_path_to_module)

        module = spec.loader.load_module()

    except Exception as ec:
        # Simple error printing
        # Insert "sophisticated" stuff here
        print(ec)

    finally:
        return module

Dies scheint nicht veraltete Module aus Python 3.4 zu verwenden. Ich gebe nicht vor zu verstehen, warum, aber es scheint innerhalb eines Programms zu funktionieren. Die Lösung von Chris funktionierte auf der Kommandozeile, aber nicht innerhalb eines Programms.

4voto

Ataxias Punkte 880

Eine einfache Lösung mit importlib anstelle der imp Paket (getestet für Python 2.7, es sollte aber auch für Python 3 funktionieren):

import importlib

dirname, basename = os.path.split(pyfilepath) # pyfilepath: '/my/path/mymodule.py'
sys.path.append(dirname) # only directories should be added to PYTHONPATH
module_name = os.path.splitext(basename)[0] # '/my/path/mymodule.py' --> 'mymodule'
module = importlib.import_module(module_name) # name space of defined module (otherwise we would literally look for "module_name")

Jetzt können Sie direkt den Namensraum des importierten Moduls verwenden, etwa so:

a = module.myvar
b = module.myfunc(a)

Der Vorteil dieser Lösung ist, dass wir müssen nicht einmal den Namen des Moduls kennen, das wir importieren möchten um sie in unserem Code zu verwenden. Dies ist z. B. nützlich, wenn der Pfad des Moduls ein konfigurierbares Argument ist.

4voto

Hengjie Punkte 4366

Dies sollte funktionieren

path = os.path.join('./path/to/folder/with/py/files', '*.py')
for infile in glob.glob(path):
    basename = os.path.basename(infile)
    basename_without_extension = basename[:-3]

    # http://docs.python.org/library/imp.html?highlight=imp#module-imp
    imp.load_source(basename_without_extension, infile)

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