2009-11-29 17 views
7

Emacs Python kabuğunda (Çalışıyorum 2. * Python) Çalışıyorum ve kodu test ettiğim bir .py dosyası alıyorum. Kodu değiştirirsem ancak tekrar nasıl alacağımı bilmiyorum. Benim okuma itibarenDeğiştirilmiş bir python dosyasını emacs python kabuğunda yeniden yükleme

şimdiye kadar

reload(modulename) 

çalışması gerektiğini görünüyor, ama görünmüyor.

Belki de sadece python kabuğunu kapatıp yeniden başlatmak yeterli olur, bunun için bir komut var mı yoksa sadece el ile mi yapıyorsunuz?

düzenleme: Bu, python-send-defun ve python-gönderme-arabellek için ideal gibi görünüyor, ancak değişiklikler yayılıyor gibi görünmüyor.

cevap

5

Benim için iş gibi görünüyor:

denilen (sizin PYTHONPATH olarak) bir dosya olun test.py

def foo(): 
    print('bar') 

Sonra emacs piton kabuğu (ya da daha iyisi, ipython kabuk) 'de, değiştirmek Şimdi

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

yazın test.py:

def foo(): 
    print('baz') 

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

Teşekkürler, mükemmel çalışıyor, garip bir şey yapmış olmalıyım. – justinhj

+0

Yeniden yükleme, varsa .pyc dosyalarından yeniden yüklemeyi tercih edecektir. Yani bir değişiklik yaparsanız, ancak pyc dosyaları yeniden oluşturulmaz veya silinmezse, değişikliğiniz kabukta görünmez. – rogueleaderr

+0

CPython'da, kaynak dosyası .pyc dosyasından daha yeni ise, 'reload' otomatik olarak kaynak dosyayı yeniden okur. Bunu şu anda belgelerde bulamıyorum, ama deneyin - işe yarıyor. – unutbu

15

reload() çalışırken, sınıflara, işlevlere ve diğer nesnelere yapılan başvuruları değiştirmez, bu nedenle eski bir sürümü görmeniz kolaydır. En tutarlı çözüm ise exec ile reload()'u (ilk olarak import kullanmamak demektir) veya yorumlayıcının tamamen yeniden başlatılmasıdır.

Yeniden yüklemeyi kullanmaya devam etmek istiyorsanız, bu modülden nasıl kaynak aldığınız konusunda çok dikkatli olun ve her zaman tam adı kullanın. Örneğin. import module ve from module import name yerine module.name kullanın. Ve dikkatli olsanız bile, hala eski nesnelerle ilgili problemlerle karşılaşırsınız. Bu, reload()'un 3.x'te olmaması nedenidir.

+1

Bu yorumun önemli şey sadece ayrıca modülü yeniden yüklemek zorunda ama olmasıdır 'new' modülünü temel alan nesneleri yeniden örneklendirmek için – Jehiah

+3

Yalnızca nasıl aldığınızın düzeltilmesi, genel durumda yeniden çalışma yapmaz. İçe aktarılan modülden herhangi bir şey (örneğin, sınıf örnekleri) kaydettiyseniz, yeniden yüklenmeyecektir. Genel olarak yeniden yükleme yapmak için, tüm kullanıcılarını yinelemeli olarak yeniden yüklemeniz gerekir. Yeniden yükleme kırılgan ve test ederken kullanmamaya karşı şiddetle tavsiye ederim - hata ayıklama işlemi yaparken birisinin en son gereksinmesi kısmi bir yeniden yükleme ile bitecek ve kabuğun yeniden başlatılması sırasında ortaya çıkan gizemli hatalara yol açacaktır. –

0

Bu konuya oldukça uzun bir süre baktıktan sonra, uygulamak için en iyi çözümün, python yorumlayıcınızın (örnek için ipython) bir başlangıç ​​dosyasına veya python yapısının kullanılmasına dayanan bir sonuca vardım. "imp" modülünde ve işlevinde "yeniden yükle". Bu çözüm bu sayfadan bana geldi

import my_module 
import imp 
imp.reload(my_module) 

#your code 

: Kodunuzdaki başında Örneğin https://emacs.stackexchange.com/questions/13476/how-to-force-a-python-shell-to-re-import-modules-when-running-a-buffer

İlgili konular