Notez qu'il était nécessaire de basculer le module PYD à lire entre 32bitOS et 64bitOS. Si le module que vous souhaitez charger est xxx.yyy.zzz et que votre environnement est Win64, Créez un hook d'importation pour lire xxx.yyy. ** win64 **. Zzz.
from xxx.yyy import zzz
#Si cette instruction d'importation se trouve dans un environnement win64
# from xxx.yyy.win64 import zzz
#Pour être le même processus que
5. Système d'importation - Python 3.4.3 Document # 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')
Le système d'exploitation est déterminé par ** sys.platform **. Vous pouvez dire s'il s'agit de 32 bits ou 64 bits avec ** sys.maxsize **. Renvoyez «win64» pour Win64 et «mac64» pour Mac.
import os.path
from importlib import import_module
from importlib.abc import MetaPathFinder
from importlib.machinery import ModuleSpec, ExtensionFileLoader
#Obtenez l'environnement d'exécution
env = get_env()
class PydMetaPathFinder(MetaPathFinder):
def find_spec(fullname, path, target=None):
if path is None:
return None
#Parcourez toute la liste des chemins
for p in path:
#Confirmation de l'existence du module
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):
#Le package parent doit être importé
import_module('.'.join([pac,env]))
name = '.'.join([pac,env,mod])
return ModuleSpec(
name=name,
loader=ExtensionFileLoader(name, origin),
origin=origin,
)
Cette fois, nous allons créer un Finder qui est enregistré dans ** sys.meta_path **, alors faites-en une sous-classe de ** MetaPathFinder **. La classe de base abstraite MetaPathFinder veut remplacer la méthode abstraite find_spec, nous allons donc l'implémenter.
La valeur de retour sera une instance de ** ModuleSpec **. Si le module ne peut pas être chargé, renvoyez None et le processus sera délégué à un autre Finder.
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 ** est une liste de Finder, vous pouvez donc ajouter une sous-classe de Finder. Après l'ajout, lorsque l'instruction d'importation est exécutée, la classe enregistrée sera interrogée.
Si vous pouvez utiliser pyximport de cython, nous vous le recommandons.