#!/usr/bin/env python3 """ Program, który czyta i modyfikuje swój własny kod, po czym wykonuje swoją zmodyfikowaną kopię. Powinien wyświetlać naprzemiennie "Ping!" i "Pong!". By zakończyć, wciskamy Ctrl+c. """ import sys, os, time print("Ping!") #Otwieramy sys.argv[0], czyli wykonywany plik - do odczytu i zapisu (r+): with open(sys.argv[0],'r+') as f: dane = f.read() #Wczytanie całej treści. pos = dane.find('print("Ping!")\n') #Pozycja linii drukującej "Ping!" if pos != -1: #Jeśli pos wynosi -1, to znaczy, że nie znaleziono. f.seek(pos) #Przesuwamy "głowicę" do znalezionej pozycji. f.write('print("Po') #Nadpisujemy ("Ping! zmienia się na "Pong!") #Poniżej dokładnie to samo co wyżej, tylko zmienia "Pong!" na "Ping!": pos = dane.find('print("Pong!")\n') if pos != -1: f.seek(pos) f.write('print("Pi') time.sleep(0.5) #Czekamy pół sekundy, żeby nie zalać terminala lawiną "Ping!-ów" i "Pong!-ów" """ Funkcja execlp przekazuje wykonywanie programu do jakiegoś nowego. W tym wypadku jest to interpreter Pythona uruchamiający ten sam plik .py z kodem. Dwa pierwsze argumenty są takie same - pierwszy mówi o tym jaki program wywołać (tu interpreter Pythona 3), a drugi ustawia arg0 (sys.argv[0]) wywoływanego programu (które z reguły jest zgodne z jego ścieżką ale jak widać można by było to zmienić). Jako kolejny argument podajemy sys.argv[0] OBECNEGO programu: czyli nazwę tego pliku .py, by został on wykonany przez python3. """ os.execlp("python3","python3",sys.argv[0])