Co się stanie, jeśli zmodyfikuję skrypt Pythona podczas jego działania?

219

Wyobraź sobie skrypt w języku Python, którego uruchomienie zajmie dużo czasu. Co się stanie, jeśli zmodyfikuję go podczas działania? Czy wynik będzie inny?

wong2
źródło
8
Program jest ładowany do głównej pamięci. Jeśli zmienisz plik źródłowy, nic się nie dzieje. Wyobraź sobie, że procesor odczytuje instrukcje z dysku twardego ...
Felix Kling
15
@ Felix: To się nazywa „Execute-in-Place” (XIP).
Ignacio Vazquez-Abrams
@Ignacio: Interesujące, nie wiedziałem o tym. Dzięki :)
Felix Kling
3
Możesz dynamicznie przeładowywać kod modułów, patrz stackoverflow.com/questions/437589/...
Iliyan Bobev,
2
Zauważ, że pliki wsadowe systemu Windows należy wykonać na miejscu, więc nie jest to hipotetyczne pytanie, istnieją języki, które obecnie nie zachowują się w ten sposób.
yoyo

Odpowiedzi:

259

Nic, ponieważ Python kompiluje skrypt do pliku PYC i uruchamia go.

Jeśli jednak wystąpi jakiś wyjątek, możesz uzyskać nieco mylące wyjaśnienie, ponieważ wiersz X może mieć inny kod niż przed uruchomieniem skryptu.

Lixas
źródło
10
Niekoniecznie do pliku.
Ignacio Vazquez-Abrams
60
Ale co, jeśli uruchomisz ponownie podczas działania, gdy nowe pliki pyc zastąpią stare, czy spowoduje to problemy w programie, który już działał, czy nie?
spowolniono, co
26
Nic się nie dzieje. Sprawdziłem to również w małym teście. Co się dzieje: pyc to tylko kompilacja. Kompilator ten jest ładowany do pamięci RAM, a następnie wykonywany. Dlatego zawsze można zmienić program, ponownie skompilować i uruchomić inną instancję, np. Na innej konsoli.
Chris
7
@Chris Uruchomiłem instancję mojego skryptu python w jednej konsoli. Gdy to działało, zmieniłem dwa wiersze kodu i uruchomiłem kolejne wystąpienie w osobnej konsoli. Po pewnym czasie otrzymałem błąd z pierwszej konsoli dotyczący dwóch linii kodu, który zmieniłem po uruchomieniu!
proszę o
14
@Chris Myślę, że wiem, co się tutaj dzieje. Jeśli zmodyfikujesz skrypt i zapiszesz go podczas działania, a błędy poprzedniej wersji podczas odczytu śledzenia wstecznego otworzą bieżącą wersję pliku i sprawią, że śledzenie będzie wyglądać inaczej niż podczas uruchamiania. Widziałem to kilka razy.
double_j