para paquetes modulos lista librerias libreria instalar importar descargar clases basicas python

paquetes - ¿Cómo volver a importar un paquete actualizado mientras está en Python Interpreter?



modulos python 3 (11)

Por lo tanto, hasta ahora he estado saliendo y volviendo a entrar en el intérprete porque volver a importar el archivo de nuevo no me funciona.

Sí, solo decir import nuevamente le brinda la copia existente del módulo de sys.modules .

Puede decir reload(module) para actualizar sys.modules y obtener una nueva copia de ese módulo único, pero si cualquier otro módulo tiene una referencia al módulo original o cualquier objeto del módulo original , mantendrán sus referencias antiguas y muy Las cosas confusas sucederán.

Entonces, si tiene un módulo a , que depende de los cambios del módulo b , y b , tiene que ''recargar b'' seguido de ''recargar a''. Si tiene dos módulos que dependen unos de otros, lo cual es extremadamente común cuando esos módulos son parte del mismo paquete, no puede volver a cargarlos: si vuelve a cargar pa obtendrá una referencia a la antigua pb , y viceversa. La única forma de hacerlo es descargarlos a la vez eliminando sus elementos de sys.modules , antes de volver a importarlos. Esto es complicado y tiene algunos inconvenientes prácticos que ver con que las entradas de módulos sean Ninguna como un marcador de importación relativa fallido.

Y si tiene un módulo que pasa las referencias a sus objetos a los módulos del sistema, por ejemplo, registra un códec o agrega un controlador de advertencias, está atascado; no puede volver a cargar el módulo del sistema sin confundir el resto del entorno Python.

En resumen: para todos, excepto el caso más simple de un módulo autónomo que se carga con un script independiente, reload() es muy difícil de lograr; Si, como implica, está utilizando un ''paquete'', probablemente será mejor que continúe con el ciclo del intérprete.

Esta pregunta ya tiene una respuesta aquí:

A menudo pruebo mi módulo en el intérprete de Python, y cuando veo un error, actualizo rápidamente el archivo .py. ¿Pero cómo hago para que se refleje en el intérprete? Por lo tanto, hasta ahora he estado saliendo y volviendo a entrar en el intérprete porque volver a importar el archivo de nuevo no me funciona.


Básicamente reload como en la respuesta de allyourcode. Pero no cambiará el código subyacente del objeto ya instanciado o las funciones referenciadas. Extendiendo de su respuesta:

#Make a simple function that prints "version 1" shell1$ echo ''def x(): print "version 1"'' > mymodule.py # Run the module shell2$ python >>> import mymodule >>> mymodule.x() version 1 >>> x = mymodule.x >>> x() version 1 >>> x is mymodule.x True # Change mymodule to print "version 2" (without exiting the python REPL) shell2$ echo ''def x(): print "version 2"'' > mymodule.py # Back in that same python session >>> reload(mymodule) <module ''mymodule'' from ''mymodule.pyc''> >>> mymodule.x() version 2 >>> x() version 1 >>> x is mymodule.x False


En Python 3, el comportamiento cambia.

>>> import my_stuff

... haz algo con my_stuff, y luego:

>>>> import imp >>>> imp.reload(my_stuff)

y obtienes un nuevo, recargado my_stuff.


La respuesta de la libélula funcionó para mí (python 3.4.3).

import sys del sys.modules[''module_name'']

Aquí hay una solución de nivel inferior:

exec(open("MyClass.py").read(), globals())


No estoy seguro de si esto hace todas las cosas esperadas, pero puede hacerlo así:

>>> del mymodule >>> import mymodule


No importa cuántas veces importe un módulo, obtendrá la misma copia del módulo de sys.modules , que se cargó al principio import mymodule

Estoy respondiendo esto tarde, ya que cada una de las respuestas anteriores / anteriores tiene un poco de la respuesta, así que estoy tratando de resumir todo en una sola respuesta.

Usando la función incorporada :

Para Python 2.x : use la función de https://docs.python.org/2/library/functions.html#reload .

Para Python 3.x : use imp.reload(mymodule) .

Para Python 3.4 - En Python 3.4 imp se ha desaprobado a favor de importlib es decir, reload

Algunas advertencias :

  • Por lo general, no es muy útil recargar módulos incorporados o cargados dinámicamente. No se recomienda recargar sys , __main__ , builtins y otros módulos clave.
  • En muchos casos, los módulos de extensión no están diseñados para inicializarse más de una vez, y pueden fallar de manera arbitraria cuando se vuelven a cargar. Si un módulo importa objetos de otro módulo usando from ... import ..., llamar a reload() para el otro módulo no redefine los objetos importados de él. Una forma de evitar esto es volver a ejecutar la instrucción from , otro es para usar nombres import y calificados (module.name) en su lugar.
  • Si un módulo crea una instancia de las instancias de una clase, volver a cargar el módulo que define la clase no afecta a las definiciones de los métodos de las instancias; continúan usando la definición de la clase anterior. Lo mismo es cierto para las clases derivadas.

Paquetes externos :

reimport : Reimport actualmente admite Python 2.4 a 2.7.

xreload : esto funciona ejecutando el módulo en un espacio de nombres desde cero, y luego aplicando parches a las clases, métodos y funciones en su lugar. Esto evita la necesidad de parchear instancias. Los nuevos objetos se copian en el espacio de nombres de destino.

livecoding : la recarga de código permite que una aplicación en ejecución cambie su comportamiento en respuesta a los cambios en los scripts de Python que utiliza. Cuando la biblioteca detecta que una secuencia de comandos de Python se ha modificado, vuelve a cargar esa secuencia de comandos y reemplaza los objetos que antes había estado disponibles para su uso con las versiones recién recargadas. Como herramienta, le permite al programador evitar la interrupción de su flujo de trabajo y la correspondiente pérdida de enfoque. Les permite permanecer en un estado de flujo. Donde antes podían haber necesitado reiniciar la aplicación para poner en vigencia el código modificado, esos cambios se pueden aplicar de inmediato.


Respuesta corta:

intente usar reimport .

Respuesta más larga:

Parece que esta pregunta se hizo / contestó antes del lanzamiento de reimport , que se anuncia a sí mismo como una "recarga completa para Python":

Este módulo pretende ser un reemplazo completo para la función de recarga de Python. Está orientado a realizar una recarga que funcione para los complementos y extensiones de Python utilizados por aplicaciones de ejecución más prolongada.

Reimport actualmente admite Python 2.4 a 2.6.

Por su propia naturaleza, este no es un problema completamente solucionable. El objetivo de este módulo es hacer que las actualizaciones más comunes funcionen bien. También permite que los módulos y paquetes individuales ayuden en el proceso. Una descripción más detallada de lo que sucede está en la página de información general.

Nota: Aunque la reimport admite explícitamente Python 2.4 a 2.6, lo he estado probando en 2.7 y parece que funciona bien.


Todas las respuestas anteriores sobre reload() o imp.reload() están en desuso.

reload() ya no es una función incorporada en python 3 y imp.reload() está marcado en desuso (consulte la help(imp) ).

Es mejor usar importlib.reload() lugar.


Vea aquí una buena explicación de cómo sus módulos dependientes no se volverán a cargar y los efectos que pueden tener:

http://pyunit.sourceforge.net/notes/reloading.html

La forma en que Pyunit lo resolvió fue rastrear los módulos dependientes anulando __import__ y luego eliminarlos de sys.modules y volver a importarlos. Sin embargo, probablemente podrían haberlos recargado.


Actualización para Python3 : (citado de la respuesta ya contestada , ya que la última edición / comentario aquí sugirió un método en desuso)

En Python 3, la reload se movió al módulo imp . En 3.4, imp fue desaprobado a favor de importlib , y se agregó reload a este último. Cuando apunte a 3 o más tarde, haga referencia al módulo apropiado cuando llame a reload o importe.

Para llevar:

  • Python3> = 3.4: importlib.reload(packagename)
  • Python3 <3.4: imp.reload(packagename)
  • Python2: continúa abajo

Utilice la función incorporada de reload :

https://docs.python.org/2/library/functions.html#reload

Cuando se ejecuta la reload(module) :

  • El código de los módulos de Python se vuelve a compilar y el código a nivel de módulo se vuelve a ejecutar, definiendo un nuevo conjunto de objetos que están vinculados a nombres en el diccionario del módulo. La función de inicio de los módulos de extensión no se llama una segunda vez.
  • Al igual que con todos los demás objetos en Python, los objetos antiguos solo se reclaman después de que sus recuentos de referencia caigan a cero.
  • Los nombres en el espacio de nombres del módulo se actualizan para apuntar a cualquier objeto nuevo o modificado.
  • Otras referencias a los objetos antiguos (como los nombres externos al módulo) no rebotan para referirse a los nuevos objetos y deben actualizarse en cada espacio de nombres donde ocurran, si así se desea.

Ejemplo:

# Make a simple function that prints "version 1" shell1$ echo ''def x(): print "version 1"'' > mymodule.py # Run the module shell2$ python >>> import mymodule >>> mymodule.x() version 1 # Change mymodule to print "version 2" (without exiting the python REPL) shell2$ echo ''def x(): print "version 2"'' > mymodule.py # Back in that same python session >>> reload(mymodule) <module ''mymodule'' from ''mymodule.pyc''> >>> mymodule.x() version 2


import sys del sys.modules[''module_name'']