Preparación ambiental
Cree una nueva carpeta foo, que contiene un archivo bar.py
$ tree foo
foo
└── bar.py
0 directories, 1 file
El contenido de bar.py es muy simple, solo se escribe una declaración impresa
print("successful to be imported")
Siempre que bar.py se importe una vez, se ejecutará una vez que se imprima
Sin importación duplicada
'Debido a la existencia de sys.modules, cuando importa un módulo importado, en realidad no es efectivo. '
>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
Repita el método de importación uno
Si usa python2 (recuerde agregar uno en la carpeta foo antes __init__.py
), hay un método de recarga que se puede usar directamente
>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> reload(bar)
successful to be imported
<module 'foo.bar' from 'foo/bar.pyc'>
Si usa python3, hay más métodos, consulte los detalles a continuación.
Repita el método de importación dos
Si usa Python3.0 -> 3.3, puede usar el método imp.reload
>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> import imp
>>> imp.reload(bar)
successful to be imported
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>
Pero este método no se recomienda en Python 3.4+
<stdin>:1: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
Repita el método de importación tres
Si está utilizando Python 3.4+, utilice el método importlib.reload
>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> import importlib
>>> importlib.reload(bar)
successful to be imported
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>
Repita el método de importación cuatro
Si sabe algo sobre el cargador de paquetes (para obtener más detalles, puede leer el artículo que escribí antes: https://iswbm.com/84.html)
También puede utilizar el siguiente método
>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> bar.__spec__.loader.load_module()
successful to be imported
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>
Repita el método de importación cinco
Dado que son sys.modules los que afectan nuestra importación repetida, ¿deberíamos simplemente eliminar el paquete importado?
>>> import foo.bar
successful to be imported
>>>
>>> import foo.bar
>>>
>>> import sys
>>> sys.modules['foo.bar']
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>
>>> del sys.modules['foo.bar']
>>>
>>> import foo.bar
successful to be imported
¿Has descubierto que en el ejemplo anterior lo usé todo from foo import bar
, pero en este ejemplo lo usé import foo.bar
?
Esto se debe a que si lo usa de from foo import bar
esta manera, desea eliminar el módulo sys.modules para anular este método no es válido.
Esto debe considerarse como un pozo pequeño. Las personas que no lo saben caerán al pozo y no podrán salir.
>>> import foo.bar
successful to be imported
>>>
>>> import foo.bar
>>>
>>> import sys
>>> del sys.modules['foo.bar']
>>> from foo import bar
>>>
Recomiendo mi libro electrónico original " PyCharm Chinese Guide ", que contiene una gran cantidad (300) de ilustraciones , está bien hecho y es digno de una colección de todos los ingenieros de Python.
La dirección es: http://pycharm.iswbm.com