Uwielbiam ipython, ale odkryłem problem z% run: importowane moduły nie są ponownie ładowane, gdy% run jest wywoływany wielokrotnie.ipython: ponowne importowanie modułów przy użyciu% run
Załóżmy plik ex1.py zawiera wiersze:
import ex2
ex2.x.append(1)
print ex2.x
i plików ex2.py zawiera:
x = []
Teraz działa Pythona ex1.py z linii poleceń wielokrotnie drukuje [1] każdego razu. Ale wywołanie %run ex1.py
z poziomu ipythona powoduje wielokrotne wydrukowanie [1], [1,1], [1,1,1] itd. Dzieje się tak, ponieważ moduł ex2.py nie jest ponownie ładowany. Mamy więc problem: protokół skryptu uruchomieniowego ipython nie odzwierciedla zachowania "prawdziwego świata".
Uwaga:
%load_ext autoreload
%autoreload 2
robi nie pomocy. Te linie zostaną przeładowane ex2.py tylko wtedy, gdy dokonano zmiany w pliku ex2.py. Jeśli nie wprowadzimy żadnych zmian lub wprowadzimy tylko zmiany w pliku ex1.py, otrzymamy niepożądane zachowanie.
Czy istnieje sposób, aby% run zachowywał się jak wiersz polecenia? To wydaje się być prawdziwym brakiem w używaniu ipython jako środowiska testowego dla skryptów. (A może morał polega na tym, że moduł nie powinien zapisywać w przestrzeni nazw innego modułu?)