Changer le module à charger pour chaque environnement d'exécution en Python

Aperçu

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

Obtenez l'environnement d'exécution

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.

Créer un crochet d'importation

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.

find_spec À propos des méthodes abstraites

  1. ** fullname **: * str * --Nom complet du module (tel que'xxx.yyy.zzz ')
  2. ** path **: * [str] * -Liste des chemins vers le package contenant le module (par exemple, ['xxx \ yyy'])
  3. ** target ** - Ignoré car je ne l'ai pas utilisé cette fois

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.

Points de mise en œuvre

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

Enregistrement des hooks d'importation

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.

Supplément

Si vous pouvez utiliser pyximport de cython, nous vous le recommandons.

Recommended Posts

Changer le module à charger pour chaque environnement d'exécution en Python
Changez le package à installer pour chaque environnement avec de la poésie
Vérifiez le fonctionnement de Python pour .NET dans chaque environnement
Sortie de la table spécifiée de la base de données Oracle en Python vers Excel pour chaque fichier
Comment définir l'environnement de développement pour chaque projet avec VSCode + extension Python + Miniconda
Comment changer le fichier de configuration pour qu'il soit lu par Python
La vidéo ne peut pas être chargée avec Spyder dans l'environnement de développement Python
Dans la commande python, python pointe vers python3.8
Exécuter le module Python unittest dans vs2017
Comment trouver la somme / somme cumulée pour chaque groupe à l'aide de DataFrame dans Spark [version Python]
Maîtriser le module lowref en Python
Comment définir la résolution de sortie pour chaque image clé dans Blender
Créer un environnement Python pour ceux qui veulent devenir des data scientists 2016
[Introduction à Python] Comment utiliser l'opérateur in dans l'instruction for?
Jupyter Notebook 6.0.2 ne peut pas être installé dans l'environnement Python 2.7 créé dans Anaconda
Méthode pour créer un environnement Python dans Xcode 6
Module pour générer le mot N-gramme en Python
MongoDB avec Python pour la première fois
Pour référencer des variables d'environnement en Python dans Blender
Comment changer de version de Python dans cloud9
Comment ajouter un module python à l'environnement anaconda
Installez le module Python dans n'importe quel répertoire
Préparer un environnement de développement Python pour chaque projet dans un environnement Windows (VSCode + virtualEnvWrapper + Pylint)
Explication d'approche pour que les débutants soient dans le top 1,5% (0,83732) dans Kaggle Titanic_3
Ajouter des points forts de la syntaxe du langage Kv à Spyder dans Python IDE
Explication d'approche pour que les débutants soient dans le top 1,5% (0,83732) dans Kaggle Titanic_1
Notifier à l'aide du Centre de notifications lorsque l'environnement d'exécution est macOS en Python
Explication d'approche pour que les débutants soient dans le top 1,5% (0,83732) dans Kaggle Titanic_2
Solution au problème que Ctrl + z ne peut pas être utilisé dans Powershell dans l'environnement Docker pour Windows (provisoire)
Que faire si vous obtenez l'erreur Le script WSGI cible '/ var / www / xxx / xxx.wsgi' ne peut pas être chargé en tant que module python
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python
Comment utiliser la bibliothèque C en Python
CERTIFICATE_VERIFY_FAILED dans Python 3.6, le programme d'installation officiel de macOS
Le moyen le plus rapide pour les débutants de maîtriser Python
++ et-ne peuvent pas être utilisés pour incrémenter / décrémenter en python
Introduction à Python Préparons l'environnement de développement
Préparer l'environnement d'exécution de Python3 avec Docker
Créez un environnement d'exécution pour chaque langue avec boot2docker
Faites correspondre la distribution de chaque groupe en Python
Essayez d'ajouter un module externe au poivre. Pour le moment, en demandes.
Pour remplacer dynamiquement la méthode suivante en python
Installez le package python dans un environnement hors ligne
Conseils pour accéder à l'API ATND avec Python
Utilisez un module de cryptographie qui gère OpenSSL en Python
Conseils pour rédiger un aplatissement concis en python
Essayez de calculer RPN avec Python (pour les débutants)
Pour ajouter un module à python que vous mettez dans Julialang
J'ai fait un module en langage C qui filtre les images chargées par Python
Comment obtenir les fichiers dans le dossier [Python]
J'ai recherché les compétences nécessaires pour devenir ingénieur web avec Python
Introduction à Python "Re" 1 Construction d'un environnement d'exécution
Instructions pour connecter Google Colab. À l'environnement d'exécution local dans un environnement Windows
Je veux afficher la progression en Python!
Utilisez os.getenv pour obtenir des variables d'environnement en Python
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 7 Comment créer un module
Utilisez tkinter pour déplacer le code de sortie en tant que "A et prétendant être B" en python
Je veux juste trouver l'intervalle de confiance à 95% de la différence de ratio de population en Python
[Pour les débutants] Web scraping avec Python "Accédez à l'URL de la page pour obtenir le contenu"
Comment compter le nombre d'occurrences de chaque élément de la liste en Python avec poids
Vous devez faire attention aux commandes que vous utilisez quotidiennement dans l'environnement de production.