Beachten Sie, dass das zu lesende PYD-Modul zwischen 32bitOS und 64bitOS umgeschaltet werden musste. Wenn das Modul, das Sie laden möchten, xxx.yyy.zzz ist und Ihre Umgebung Win64 ist, Erstellen Sie einen Import-Hook zum Lesen von xxx.yyy. ** win64 **. Zzz.
from xxx.yyy import zzz
#Wenn sich diese Importanweisung in einer Win64-Umgebung befindet
# from xxx.yyy.win64 import zzz
#Der gleiche Prozess sein wie
5. System importieren - Python 3.4.3 Dokument # import-hooks
import sys
def get_env():
platform = ''
if sys.platform.startswith('win') or sys.platform.startswith('cygwin'):
platform = 'win'
elif sys.platform.startswith('darwin'):
platform = 'mac'
elif sys.platform.startswith('linux'):
platform = 'lnx'
return platform + ('32' if sys.maxsize < 2**31 else '64')
Das Betriebssystem wird durch ** sys.platform ** bestimmt. Mit ** sys.maxsize ** können Sie feststellen, ob es sich um 32-Bit oder 64-Bit handelt. Geben Sie "win64" für Win64 und "mac64" für Mac zurück.
import os.path
from importlib import import_module
from importlib.abc import MetaPathFinder
from importlib.machinery import ModuleSpec, ExtensionFileLoader
#Holen Sie sich die Ausführungsumgebung
env = get_env()
class PydMetaPathFinder(MetaPathFinder):
def find_spec(fullname, path, target=None):
if path is None:
return None
#Scannen Sie die gesamte Liste der Pfade
for p in path:
#Bestätigung der Modulexistenz
pac_mod = fullname.rsplit('.', maxsplit=1)
pac,mod = pac_mod[0],pac_mod[-1]
origin = os.path.join(p, env, mod+'.pyd')
if os.path.exists(origin):
#Das übergeordnete Paket muss importiert werden
import_module('.'.join([pac,env]))
name = '.'.join([pac,env,mod])
return ModuleSpec(
name=name,
loader=ExtensionFileLoader(name, origin),
origin=origin,
)
Dieses Mal erstellen wir einen Finder, der in ** sys.meta_path ** registriert ist. Machen Sie ihn also zu einer Unterklasse von ** MetaPathFinder **. Die abstrakte MetaPathFinder-Basisklasse möchte die abstrakte Methode find_spec überschreiben, daher implementieren wir sie.
Der Rückgabewert ist eine Instanz von ** ModuleSpec **. Wenn das Modul nicht geladen werden kann, geben Sie None zurück und der Prozess wird an einen anderen Finder delegiert.
31.5. importlib – The implementation of import — Python 3.5.0 documentation #import_module 31.5. importlib – The implementation of import — Python 3.5.0 documentation #MetaPathFinder 31.5. importlib – The implementation of import — Python 3.5.0 documentation #SourceFileLoader 31.5. importlib – The implementation of import — Python 3.5.0 documentation #ExtensionFileLoader 31.5. importlib – The implementation of import — Python 3.5.0 documentation #ModuleSpec
import sys
sys.meta_path.append(PydMetaPathFinder)
** sys.meta_path ** ist eine Liste von Finder, sodass Sie eine Unterklasse von Finder anhängen können. Nach dem Anhängen wird beim Ausführen der Importanweisung die registrierte Klasse abgefragt.
Wenn Sie Cythons Pyximport verwenden können, empfehlen wir dies.
Recommended Posts