Maison  >  Article  >  développement back-end  >  Comparez les différences d'utilisation de import reload __import__ en python

Comparez les différences d'utilisation de import reload __import__ en python

巴扎黑
巴扎黑original
2017-09-19 10:45:101791parcourir

import

Fonction : Importer/introduire un module standard python, qui comprend 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 : utilisez l'instruction d'importation plusieurs fois , le module spécifié ne sera pas rechargé, mais l'adresse mémoire du module sera référencée à la variable d'environnement locale.

Exemple :

pythontab.py

#!/usr/bin/env python    
#encoding: utf-8  
import os  
print 'in pythontab',id(os)

test.py

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

reload

Fonction : Pour charger le Le module est rechargé, ce qui 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 initialement utilisée sera toujours utilisée. L'ancienne module, et l'instance nouvellement produite utilisera le nouveau module ; après le rechargement, l'adresse mémoire d'origine ne sera toujours pas prise en charge ; . importer. . le module de format est rechargé.

Exemple :

pythontab.py

#!/usr/bin/env python    
#encoding: utf-8  
import os  
print 'in pythontab',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 :

ci-dessus Comme mentionné, la fonction reload ne sera utilisée que dans des circonstances particulières ; en plus des modifications du fichier de module d'origine, quelles autres situations nécessitent l'utilisation de la fonction reload ?

#!/usr/bin/env python    
#encoding: utf-8  
import sys   #引用sys模块进来,并不是进行sys的第一次加载  
reload(sys)  #重新加载sys  
sys.setdefaultencoding('utf8')  ##调用setdefaultencoding函数

Le code ci-dessus est correct, puis testez le code suivant

#!/usr/bin/env python    
#encoding: utf-8  
import sys     
sys.setdefaultencoding('utf8')

Le test ci-dessus échouera, alors pourquoi devez-vous d'abord recharger le module sys lors de l'appel de setdefaultencoding ? Étoffe de laine? 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('utf8')    
del sys.setdefaultencoding   ##删除原来的setdefaultencoding函数     
sys.setdefaultencoding('gb2312')

Alors, qui a importé sys et appelé la fonction setdefaultencoding auparavant ? 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 ne reçoit que des chaînes en tant que paramètres, donc sa fonction est Vous le savez. En fait, l'instruction import appelle cette fonction pour effectuer le travail d'importation import sys 209861d5cd2975725c730f519ed6ad71sys = __import__('sys')

Utilisez :

__import__(module_name[, globals[, locals[, fromlist]]]) #Les paramètres facultatifs par défaut sont globals(), locals(),[]

__import__('os')

__import__('os' ,globals( ),locals(),['path','pip']) #Équivalent au chemin d'importation du système d'exploitation, pip

Remarque :

Habituellement, cette fonction peut être utilisée lors d'une dynamique chargement , par exemple, si vous souhaitez charger tous les modules d'un dossier, mais que les noms des modules en dessous changent 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 :

Puisque les modules peuvent être importés dynamiquement via des chaînes, est-il possible de recharger dynamiquement des modules 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__('a')      #第一次导入会打印消息  
del sys.modules['a']   #unimport  
__import__('a')    #再次导入还是会打印消息,因为已经unimport一次了  
__import__('a')    #这次就不会打印消息了

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