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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top