Wechseln Sie das zu ladende Modul für jede Ausführungsumgebung in Python

Überblick

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

Holen Sie sich die Ausführungsumgebung

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.

Machen Sie einen Import-Hook

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.

find_spec Informationen zu abstrakten Methoden

  1. ** vollständiger Name **: * str * - Vollständiger Modulname (wie 'xxx.yyy.zzz')
  2. ** Pfad **: * [str] * -Liste der Pfade zu dem Paket, das das Modul enthält (z. B. ['xxx \ yyy'])
  3. ** Ziel ** - Ignoriert, weil ich es diesmal nicht benutzt habe

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.

Implementierungspunkte

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

Importieren von Import-Hooks

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.

Ergänzung

Wenn Sie Cythons Pyximport verwenden können, empfehlen wir dies.

Recommended Posts

Wechseln Sie das zu ladende Modul für jede Ausführungsumgebung in Python
Wechseln Sie das zu installierende Paket für jede Umgebung mit Gedichten
Überprüfen Sie die Funktionsweise von Python für .NET in jeder Umgebung
Geben Sie für jede Datei die angegebene Tabelle der Oracle-Datenbank in Python in Excel aus
So legen Sie die Entwicklungsumgebung für jedes Projekt mit VSCode + Python-Erweiterung + Miniconda fest
So wechseln Sie die Konfigurationsdatei, die von Python gelesen werden soll
Videos können in der Python-Entwicklungsumgebung nicht mit Spyder geladen werden
Im Python-Befehl zeigt Python auf Python3.8
Führen Sie das Python-Unittest-Modul in vs2017 aus
So ermitteln Sie die kumulative Summe für jede Gruppe mithilfe von DataFrame in Spark [Python-Version]
Beherrsche das schwache Ref-Modul in Python
So stellen Sie die Ausgabeauflösung für jeden Keyframe in Blender ein
Aufbau einer Python-Umgebung für diejenigen, die Datenwissenschaftler 2016 werden möchten
[Einführung in Python] Wie verwende ich den Operator in in der for-Anweisung?
Jupyter Notebook 6.0.2 kann nicht in der in Anaconda erstellten Python 2.7-Umgebung installiert werden
Methode zum Erstellen einer Python-Umgebung in Xcode 6
Modul zum Generieren des Wortes N-Gramm in Python
MongoDB mit Python zum ersten Mal
Verweisen auf Umgebungsvariablen in Python in Blender
So wechseln Sie die Python-Version in Cloud9
So fügen Sie der Anaconda-Umgebung ein Python-Modul hinzu
Installieren Sie das Python-Modul in einem beliebigen Verzeichnis
Bereiten Sie eine Python-Entwicklungsumgebung für jedes Projekt in einer Windows-Umgebung vor (VSCode + virtualEnvWrapper + Pylint).
Annäherungserklärung für Anfänger, um in Kaggle Titanic_3 unter den besten 1,5% (0,83732) zu sein
Hinzufügen von Kv-Sprachsyntax-Highlights zu Spyder in Python IDE
Annäherungserklärung für Anfänger, um in Kaggle Titanic_1 unter den besten 1,5% (0,83732) zu sein
Benachrichtigen Sie mit Notification Center, wenn die Ausführungsumgebung in Python macOS ist
Annäherungserklärung für Anfänger, um in Kaggle Titanic_2 unter den besten 1,5% (0,83732) zu sein
Lösung für das Problem, dass Strg + z in Powershell in Docker für Windows nicht verwendet werden kann (vorläufig)
Was tun, wenn der Fehler angezeigt wird? Das Ziel-WSGI-Skript '/ var / www / xxx / xxx.wsgi' kann nicht als Python-Modul geladen werden
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python
Verwendung der C-Bibliothek in Python
CERTIFICATE_VERIFY_FAILED in Python 3.6, dem offiziellen Installationsprogramm für macOS
Der schnellste Weg für Anfänger, um Python zu beherrschen
++ und-können nicht zum Inkrementieren / Dekrementieren in Python verwendet werden
Einführung in Python Bereiten wir die Entwicklungsumgebung vor
Bereiten Sie die Ausführungsumgebung von Python3 mit Docker vor
Erstellen Sie mit boot2docker eine Ausführungsumgebung für jede Sprache
Passen Sie die Verteilung jeder Gruppe in Python an
Versuchen Sie, Pfeffer ein externes Modul hinzuzufügen. Vorerst in Anfragen.
Dynamisches Ersetzen der nächsten Methode in Python
Installieren Sie das Python-Paket in einer Offline-Umgebung
Tipps zum Erreichen der ATND-API mit Python
Verwenden Sie ein Kryptografiemodul, das OpenSSL in Python verarbeitet
Tipps zum Schreiben werden in Python kurz abgeflacht
Versuchen Sie, RPN mit Python zu berechnen (für Anfänger)
So fügen Sie Python ein Modul hinzu, das Sie in Julialang eingefügt haben
Ich habe ein Modul in C-Sprache erstellt, das von Python geladene Bilder filtert
So erhalten Sie die Dateien im Ordner [Python]
Ich suchte nach den Fähigkeiten, die erforderlich sind, um Webingenieur bei Python zu werden
Einführung in Python "Re" 1 Erstellen einer Ausführungsumgebung
Anweisungen zum Verbinden von Google Colab mit der lokalen Laufzeit in einer Windows-Umgebung
Ich möchte den Fortschritt in Python anzeigen!
Verwenden Sie os.getenv, um Umgebungsvariablen in Python abzurufen
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 7 Erstellen eines Moduls
Verwenden Sie tkinter, um den Ausgabecode in Python als "A und vorgeben, B zu sein" zu verschieben
Ich möchte nur das 95% -Konfidenzintervall des Unterschieds im Bevölkerungsverhältnis in Python ermitteln
[Für Anfänger] Web-Scraping mit Python "Greifen Sie auf die URL auf der Seite zu, um den Inhalt abzurufen."
So zählen Sie die Anzahl der Vorkommen jedes Elements in der Liste in Python mit der Gewichtung
Sie müssen vorsichtig mit den Befehlen sein, die Sie jeden Tag in der Produktionsumgebung verwenden.