2016-08-17 21 views
5

Uruchomiłem skrypt Pythona, który zajmuje dużo czasu, i głupio mi, że zapomniałem wydrukować wartości ważnych zmiennych co jakiś czas w moim skrypcie, aby na przykład oszacować postęp obliczeń, które robię. Tak więc zastanawiałem się, czy istnieje sposób na uzyskanie dostępu do bieżących wartości niektórych zestawów zmiennych w moim kodzie (np. Liście), ponieważ skrypt jest uruchomiony? (Mogłem oczywiście po prostu zatrzymać to i dodać zmiany/wydruki do kodu, a następnie ponownie uruchomić, ale ponieważ działa już od jednego dnia, szkoda jest tracić jak dotąd obliczone wartości)Odczytywanie zmiennych Pythona podczas pracy

Alternatywnie, można Rozbijałem go w pewien sposób (poza zwykłym przerywaniem klawiatury Ctrl-c) tak, że wartości zmiennych w momencie awarii są wklejane gdzieś, ponieważ nie planowałem tego w moim skrypcie? (Używam Ubuntu, python 2.7, a skrypt jest uruchamiany po prostu z terminala przez "python test.py")

+0

Uwaga - w przyszłości * zawsze * 'logging' użyć modułu porównaniu oświadczenia drukowania. Jeśli dostaniesz ten nawyk, zawsze będziesz wyrzucał dane. Jeśli dojdziesz do punktu, w którym naprawdę ci to nie przeszkadza, możesz zmniejszyć poziom rejestrowania, aby wyświetlał tylko komunikaty ostrzegawcze/wyjątki (lub w ogóle nic). –

+0

@WayneWerner Wielkie dzięki za cynk, naprawdę masz absolutną rację. Czuję się teraz tak smutno i głupio ... –

Odpowiedz

6

Bez edytowania programu będziesz miał zły czas. To, czego szukasz, to jakaś forma zdalnego debuggera, ale wszystko, co daje ci konkretne rzeczy, będzie prawdopodobnie musiało być przynajmniej w jakiś sposób powiązane z twoim programem. Mówiąc to, jeśli masz ochotę błądzić w stosie, możesz dołączyć gdb do swojego programu (gdb -p <PID>) i zobaczyć, co możesz znaleźć.

Edytuj: Dobrze. To może być rzeczywiście możliwe.

Po here, przy czym extentions python dla GDB zainstalowany, jeśli pop otworzyć powłoki gdb z gdb python <PID>, powinieneś być w stanie uruchomić py-print <name of the variable> dostać swoją wartość, zakładając, że w ramach programu w tym punkcie. Próbując to zrobić sam, z programem trywialny

import time 
a = 10 
time.sleep(1000) 

udało mi się otworzyć skorupę GDB poprzez znalezienie PID programu (ps aux | grep python), bieganie sudo gdb python <PID> a następnie uruchomić py-print a, który produkował „globalne„a "= 10". Oczywiście zakłada to, że działasz w środowisku * nix.

Tawling w powłoce GDB przez chwilę, stwierdziłem, że możesz wchodzić w interakcje z prymitywami Pythona. Na przykład, aby uzyskać długość tablicy:

(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')) 

Note wymóg stosowania rzeczywiste nazwy pól wewnętrznych dostać rzeczy (wartości rzeczywiste z listy można znaleźć w „ob_item”, a następnie indeks).

Można zrzucić tablicę do pliku w podobny sposób:

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

Podoba mi się pomysł na gdb, dziękuję. Czy możesz mi dać trochę liny, w jaki sposób mogę użyć gdb, aby uzyskać dostęp do pewnej zmiennej? (w fałszywym przykładzie, więc mogę zobaczyć pomysł) –

+0

@ user929304 Oto tutaj problem. Bez dodawania konkretnych haków do twojego programu, wszelkie informacje o tym, które bity pamięci są odwzorowane, które zmienne są skutecznie tracone. GDB da ci mnóstwo pamięci, która będzie najlepsza, co będziesz w stanie zrobić. – Sinkingpoint

+0

@ user929304 Myliłem się! Zobacz edycję. – Sinkingpoint