Maison  >  Article  >  développement back-end  >  Explication détaillée des différences entre import, reload et __import__ en Python

Explication détaillée des différences entre import, reload et __import__ en Python

黄舟
黄舟original
2017-10-16 11:04:241500parcourir

Cet article présente principalement l'explication détaillée de la différence entre import reload __import__ en Python. Les amis qui en ont besoin peuvent se référer à

import<.>

Fonction : Importer/introduire un module standard python, comprenant des fichiers .py et des répertoires avec des fichiers __init__.py (modules personnalisés).


import module_name[,module1,...] 
from module import *|child[,child1,...]
Remarque : lorsque l'instruction d'importation est utilisée plusieurs fois, le module spécifié ne sera pas rechargé, mais l'adresse mémoire du module sera référencée au local environnement variable.

Exemple :

pythontab.py


#!/usr/bin/env python  
#encoding: utf-8 
import os 
print &#39;in pythontab&#39;,id(os)
test.py


#!/usr/bin/env python  
#encoding: utf-8 
import pythontab  #第一次会打印pythontab里面的语句 
import os #再次导入os后,其内存地址和pythontab里面的是一样的,因此这里只是对os的本地引用 
print &#39;in c&#39;,id(os) 
import pythontab #第二次不会打印pythontab里面的语句,因为没有重新加载
reload

Fonction : Recharger un module déjà chargé Il est généralement utilisé dans des situations particulières telles que des modifications dans le module d'origine. Le module doit avoir été importé avant le rechargement.


import os
reload(os)
Remarque :

reload rechargera le module chargé, mais l'instance d'origine utilisera toujours l'ancien module, et le nouveau le fera toujours. utiliser l'ancien module. L'instance produite utilisera le nouveau module ; l'adresse mémoire d'origine sera utilisée après le rechargement à partir de n'est pas prise en charge. . importer. . le module de formatage est rechargé.

Exemple :

pythontab.py


#!/usr/bin/env python  
#encoding: utf-8 
import os 
print &#39;in pythontab&#39;,id(os)
test.py


#!/usr/bin/env python  
#encoding: utf-8 
import pythontab  #第一次import会打印pythontab里面的语句 
print id(pythontab) #原来pythontab的内存地址 
reload(pythontab) #第二次reload还会打印pythontab里面的语句,因为有重新加载 
print id(pythontab) #reload后pythontab的内存地址,和原来一样
Extension :

Comme mentionné ci-dessus, la fonction de rechargement ne sera utilisée que dans des circonstances particulières. En plus de la modification du fichier du module d'origine, quelles autres situations nécessitent l'utilisation de la fonction de rechargement. ? Voici un exemple.


#!/usr/bin/env python  
#encoding: utf-8 
import sys  #引用sys模块进来,并不是进行sys的第一次加载 
reload(sys) #重新加载sys 
sys.setdefaultencoding(&#39;utf8&#39;) ##调用setdefaultencoding函数
Le code ci-dessus est correct, puis testez le code suivant


#!/usr/bin/env python  
#encoding: utf-8 
import sys   
sys.setdefaultencoding(&#39;utf8&#39;)
Le ci-dessus le test échouera, alors pourquoi devons-nous d'abord recharger le module sys lors de l'appel de setdefaultencoding ? Parce que l'instruction import ici n'est pas réellement la première instruction import de sys, c'est-à-dire qu'elle peut en fait être la deuxième ou la troisième importation du module sys. Il s'agit simplement d'une référence à sys et ne peut être rechargée que par reload ; alors Pourquoi doit-il être rechargé, mais la fonction ne peut pas être appelée si elle est directement référencée ? Étant donné que la fonction setdefaultencoding est supprimée après avoir été appelée par le système, elle n'est plus là lorsqu'elle est référencée via l'importation. Par conséquent, le module sys doit être rechargé une fois pour que setdefaultencoding soit disponible et que le codage de caractères actuel de l'interpréteur puisse être. modifié dans le code. Essayez le code suivant, la même erreur sera signalée :


#!/usr/bin/env python  
#encoding: utf-8 
import sys  
reload(sys)  
sys.setdefaultencoding(&#39;utf8&#39;)  
del sys.setdefaultencoding  ##删除原来的setdefaultencoding函数   
sys.setdefaultencoding(&#39;gb2312&#39;)
Alors, qui a importé sys auparavant et appelé la fonction setdefaultencoding ? La réponse se trouve dans le dossier Lib du répertoire d'installation de Python. Il existe un fichier appelé site.py [python2.6], dans lequel vous pouvez trouver main() --> setencoding() -->sys.setdefaultencoding( encoding), car ce site.py sera automatiquement chargé à chaque démarrage de l'interpréteur python, donc la fonction principale sera exécutée à chaque fois et la fonction setdefaultencoding sera supprimée dès sa sortie.

__import__

Fonction :

La même fonction que l'instruction import, mais __import__ est une fonction et seulement elle reçoit une chaîne en paramètre, donc sa fonction peut être imaginée. En fait, l'instruction import appelle cette fonction pour effectuer le travail d'importation import sys 209861d5cd2975725c730f519ed6ad71sys = __import__('sys')

Utilisez :


Remarque :
__import__(module_name[, globals[, locals[, fromlist]]]) #可选参数默认为globals(),locals(),[]
__import__(&#39;os&#39;)  
__import__(&#39;os&#39;,globals(),locals(),[&#39;path&#39;,&#39;pip&#39;]) #等价于from os import path, pip

Habituellement, cette fonction peut être utilisée lors du chargement dynamique. Par exemple, si vous souhaitez charger les modules utilisés dans un certain dossier, mais que les noms des modules en dessous changeront fréquemment. , vous pouvez utiliser cette fonction pour charger dynamiquement tous les modules. Le scénario le plus courant est la prise en charge des fonctions de plug-in.

Extension :

Étant donné que les modules peuvent être importés dynamiquement via des chaînes, les modules peuvent-ils être rechargés dynamiquement via des chaînes ? Essayez reload('os') pour signaler une erreur directement. N'y a-t-il pas d'autre moyen ? Bien que vous ne puissiez pas recharger directement, vous pouvez d'abord désimporter un module, puis __import__ pour recharger le module. Voyons maintenant comment l'opération de désimportation est implémentée. Dans l'interprétation Python, vous pouvez afficher les modules chargés dans l'environnement actuel et leurs emplacements via globals(), locals(), vars(), dir() et d'autres fonctions, mais celles-ci ne peut être visualisé que par Supprimer, il ne peut donc pas être désimporté ; cependant, il existe un autre endroit spécifiquement pour stocker les modules, qui est sys.modules, vous pouvez afficher tous les modules chargés et réussis, et il y en a plus que des globaux. , indiquant que la valeur par défaut Certains modules supplémentaires seront chargés et que l'étape suivante consiste à annuler l'importation.


#!/usr/bin/env python  
#encoding: utf-8 
import sys 
__import__(&#39;a&#39;)   #第一次导入会打印消息 
del sys.modules[&#39;a&#39;]  #unimport 
__import__(&#39;a&#39;)  #再次导入还是会打印消息,因为已经unimport一次了 
__import__(&#39;a&#39;)  #这次就不会打印消息了

Résumé

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn