2016-08-17 21 views
5

Bitirmek için çok uzun süren bir python betiği başlattım ve aptalca bana şimdi ve sonra komut dosyasımda önemli değişkenlerin değerlerini yazdırmayı unuttum. yaptığım hesaplamaların ilerleyişi. Şimdi, komut dosyası çalışırken kodumdaki belirli değişkenlerin geçerli değerlerine (ör. Bir liste) erişmenin bir yolu olup olmadığını merak ediyordum? (Tabii ki durdurabilirim ve değişiklikleri/baskıları koda yeniden eklerim, ancak yeniden başlatıyor, ama bir günlüğüne çalışıyor olduğu için, şu ana kadar hesaplanan değerleri kaybetmek üzücüdür)Çalışan bir iş sırasında python değişkenlerini okuma

Alternatif olarak, Kaza anında değişken değerler çarpıĢma sırasında belli bir Ģekilde çakılmıĢ olur (ben her zamanki Ctrl-c klavye kesmesi gibi). (Ubuntu'yu çalıştırıyorum, python 2.7 ve betik sadece bir terminalden 'python test.py' ile çalıştırılıyor)

+0

Not - Gelecekte * daima 'logging' modülü vs baskı ifadeleri kullanırlar. Bu alışkanlığa girerseniz, her zaman veri döküyorsunuz. Gerçekten umursamadığınız bir noktaya ulaşırsanız, günlük seviyesini düşürerek yalnızca uyarı/istisna mesajları (ya da hiç bir şey) göstermezsiniz. –

+0

@WayneWerner İpucu için çok teşekkürler, gerçekten haklısınız. Şu anda çok üzgün ve aptal hissediyorum ... –

cevap

6

Programınızı düzenlemeden, kötü bir zamanınız olacak. Aradığınız şey uzak hata ayıklayıcının bir biçimidir, ancak python'a özgü şeyleri veren her şey muhtemelen en azından bir şekilde programınıza bir kanca verilmelidir. Bu, eğer bir yığın içinde dolaşmak istiyorsanız, programınıza gdb'yi (gdb -p <PID>) ekleyebilir ve ne bulabileceğinizi görebilirsiniz.

Düzeltme: Eh. Bu aslında mümkün olabilir.

GDB için piton uzantıları yüklü Eğer gdb python <PID> ile gdb kabuğu açabilir pop eğer here, yazın, bunu o noktada programın kapsamında olduğunu varsayarak, değerini almak için py-print <name of the variable> çalıştırmak mümkün olmalıdır takiben. önemsiz programla, bu kendim yapmak için çalışılıyor

import time 
a = 10 
time.sleep(1000) 

hangi ' "küresel üretti, py-print a çalıştırmak sonra sudo gdb python <PID> çalışan programın (ps aux | grep python) PID bularak GDB kabuk açıp başardı '= 10 ". Elbette bu, * nix ortamında çalıştığınızı varsayar.

Bir süreliğine GDB kabuğunda gezinirken, Python primitifleriyle gerçekten etkileşimde bulunabileceğinizi keşfettim. Bir dizin ardından 'ob_item' ile bulunabilir

(gdb) python-interative 
>>> frame = Frame.get_selected_python_frame() 
>>> pyop_frame = frame.get_pyop() 
>>> var, scope = pyop_frame.get_var_by_name('<variable name>') 
>>> print(var.field('ob_size')) 

Not şeyler (listenin gerçek değerleri elde etmek için gerçek iç alan adlarını kullanmaya gereksinimi ve: Örneğin, bir dizinin uzunluğunu almak için).

Sen benzer şekilde bir dosyaya dizi dökümü:

length = int(str(var.field('ob_size')) 
output = [] 
for i in range(length): 
    output.append(str(var[i])) 
with open('dump', 'w') as f: 
    f.write(', '.join(output)) 
+0

gdb fikrini beğendim, teşekkürler. Belirli bir değişkene erişmek için gdb'yi nasıl kullanabileceğime dair biraz ip verebilir misiniz? (kukla bir örnekte bu fikri görebilmem için) –

+0

@ user929304 Burada sorun bu. Programınıza belirli kancalar eklemeden, hangi değişkenlerin etkin bir şekilde kaybolduğu ile ilgili bellek bitleri hakkında bilgi. GDB size yapabileceğiniz en iyi şey hakkında bir bellek dökümü verecektir. – Sinkingpoint

+0

@ user929304 Yanılıyordum! Düzenleme konusuna bakın. – Sinkingpoint

İlgili konular