Como hacer pdb reconocer que la fuente ha cambiado entre las corridas?
Pregunta
Por lo que puedo decir, AP no reconoce cuando el código fuente ha cambiado entre "corre". Es decir, si yo soy la depuración, se dio cuenta de un error, corregir ese error y vuelva a ejecutar el programa en el APP (es decir, sin necesidad de salir AP), PDB no volver a compilar el código. Voy a seguir depurando la versión anterior del código, incluso si las listas pdb el nuevo código fuente.
Por lo tanto, no pdb no actualizar el código compilado como la fuente cambia? Si no, ¿hay una manera de hacer que funcione? Me gustaría ser capaz de permanecer en una sola sesión de AP con el fin de mantener los puntos de ruptura y tal.
Fwiw, GDB se dará cuenta cuando el programa se depura cambios por debajo de ella, aunque sólo en un reinicio de ese programa. Este es el comportamiento que estoy tratando de replicar en el APP.
Solución
¿Qué quiere decir por "volver a ejecutar el programa en el APP?" Si ha importado un módulo, Python no releerlo a menos que pide explícitamente a hacerlo, es decir, con reload(module)
. Sin embargo, reload
está lejos de ser a prueba de balas (ver xreload para otro estrategia).
Hay un montón de trampas en el código Python recarga. Para resolver de forma más robusta su problema, usted puede envolver AP con una clase que registra la información de su punto de interrupción en un archivo en el disco, por ejemplo, y las reproduce en el comando.
(Lo sentimos, ignorar la primera versión de esta respuesta;. Que es temprano y yo no leer su pregunta bastante cuidado)
Otros consejos
El siguiente mini-módulo puede ayudar. Si importa que en su sesión de AP, a continuación, puede utilizar:
pdb> pdbs.r()
en cualquier momento para forzar-recargar todos los módulos no pertenecientes al sistema excepto principal . El código se salta que debido a que produce una ImportError ( 'No se puede re-init módulo interno principal ') es una excepción.
# pdbs.py - PDB support
from __future__ import print_function
def r():
"""Reload all non-system modules, so a pdb restart
will reload anything new
"""
import sys
# This is likely to be OS-specific
SYS_PREFIX = '/usr/lib'
for k, v in sys.modules.items():
if not hasattr(v, '__file__'):
continue
if v.__file__.startswith(SYS_PREFIX):
continue
if k == '__main__':
continue
print('reloading %s [%s]' % (k, v.__file__))
reload(v)
IPDB extensión %autoreload
6.2.0 docs documentar http://ipython.readthedocs.io/en/stable/config/extensions/autoreload.html#module-IPython.extensions.autoreload :
In [1]: %load_ext autoreload
In [2]: %autoreload 2
In [3]: from foo import some_function
In [4]: some_function()
Out[4]: 42
In [5]: # open foo.py in an editor and change some_function to return 43
In [6]: some_function()
Out[6]: 43