2009-11-29 6 views
7

En el shell Python de emacs (estoy ejecutando 2. * Python) Estoy importando un archivo .py con el que estoy trabajando y probando el código. Sin embargo, si cambio el código, no estoy seguro de cómo volver a importarlo.Recarga de un archivo python cambiado en el shell python de emacs

De mi lectura hasta el momento parece que

reload(modulename) 

debería funcionar, pero parece que no.

Tal vez basta con cerrar el shell python y reiniciarlo, ¿hay un comando para eso o simplemente lo hace manualmente?

editar: Parece que python-send-defun y python-send-buffer serían ideales, pero los cambios no parecen propagarse.

Respuesta

5

parece que funciona para mí:

hacer un archivo (en su PYTHONPATH) llamada test.py

def foo(): 
    print('bar') 

Luego, en la cáscara emacs pitón (o mejor aún, la cáscara ipython), escriba

>>> import test 
>>> test.foo() 
bar 

Ahora modifique test.py:

def foo(): 
    print('baz') 

>>> reload(test) 
<module 'test' from '/home/unutbu/pybin/test.py'> 
>>> test.foo() 
baz 
+0

Gracias funciona perfectamente ahora, debo haber estado haciendo algo raro. – justinhj

+0

Tenga en cuenta que la recarga preferirá volver a cargar desde archivos .pyc si está disponible. Por lo tanto, si realiza un cambio pero los archivos pyc no se reconstruyen o eliminan, su cambio no aparecerá en el shell. – rogueleaderr

+0

En CPython, 'reload' vuelve a leer automáticamente el archivo fuente si el archivo fuente es más reciente que el archivo .pyc. No puedo encontrar esto en la documentación en este momento, pero pruébalo; funciona. – unutbu

15

Aunque reload() funciona, no cambia las referencias a las clases, funciones y otros objetos, por lo que es fácil ver una versión anterior. Una solución más consistente es reemplazar reload() con exec (lo que significa que no se usa import en primer lugar) o reiniciar el intérprete por completo.

Si desea seguir utilizando la recarga, tenga mucho cuidado con la referencia de ese módulo y siempre use el nombre completo. P.ej. import module y use module.name en lugar de from module import name. Y, aun teniendo cuidado, aún se encontrará con problemas con objetos viejos, que es una de las razones por las que reload() no está en 3.x.

+1

lo importante en este comentario es que no sólo tiene que volver a cargar el módulo, sino también para volver a crear instancias de objetos en función del módulo 'nuevo' – Jehiah

+3

Solo la manera de importar no hará que la recarga funcione en el caso general. Si almacenó algo del módulo importado (por ejemplo, instancias de clase), no se volverá a cargar. Para realizar trabajos de recarga en general, debe volver a cargar todos sus usuarios de manera recursiva. Recargar es quebradizo, y recomiendo enfáticamente que no se lo use durante las pruebas, lo último que alguien necesita cuando la depuración se ve afectada por una recarga parcial, lo que genera misteriosos errores que desaparecen cuando reinicias el shell. –

0

Después de ver este tema durante un tiempo bastante extenso, llegué a la conclusión de que la mejor solución para implementar es, ya sea basada en un archivo de inicialización de su intérprete python (ipython por ejemplo), o usando la construcción python- en el módulo "imp" y su función "recargar". Por ejemplo en el comienzo de su código:

import my_module 
import imp 
imp.reload(my_module) 

#your code 

Esta solución me vino de esta página: https://emacs.stackexchange.com/questions/13476/how-to-force-a-python-shell-to-re-import-modules-when-running-a-buffer

Cuestiones relacionadas