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?
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 :)
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.
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.
Odpowiedzi:
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.
źródło