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