OP pyta o detatching matplotlib
plots. Większość odpowiedzi zakłada wykonanie polecenia z interpretera python. Przypadek użycia przedstawiony tutaj to moja preferencja do testowania kodu w terminalu (np. Bash), w którym file.py
uruchamiany jest a, a chcesz, aby wykresy pojawiały się, ale skrypt python musi się zakończyć i powrócić do wiersza poleceń.
Ten autonomiczny plik służy multiprocessing
do uruchomienia osobnego procesu drukowania danych matplotlib
. Główny wątek kończy się przy użyciu os._exit(1)
wspomnianego w tym poście. Te os._exit()
siły główne, aby wyjść ale pozostawia matplotlib
proces dziecko żyje i reagujących aż okno działka jest zamknięta. To całkowicie osobny proces.
To podejście przypomina trochę sesję programistyczną Matlab z oknami figury, które zawierają responsywny wiersz polecenia. Dzięki takiemu podejściu utraciłeś cały kontakt z procesem okna figury, ale jest to odpowiednie do programowania i debugowania. Po prostu zamknij okno i kontynuuj testowanie.
multiprocessing
jest przeznaczony do wykonywania kodu tylko w języku Python, co sprawia, że może lepiej nadaje się niż subprocess
. multiprocessing
jest wieloplatformowy, więc powinno działać dobrze w systemie Windows lub Mac z niewielką lub żadną regulacją. Nie ma potrzeby sprawdzania systemu operacyjnego. Zostało to przetestowane na systemie Linux, Ubuntu 18.04LTS.
#!/usr/bin/python3
import time
import multiprocessing
import os
def plot_graph(data):
from matplotlib.pyplot import plot, draw, show
print("entered plot_graph()")
plot(data)
show() # this will block and remain a viable process as long as the figure window is open
print("exiting plot_graph() process")
if __name__ == "__main__":
print("starting __main__")
multiprocessing.Process(target=plot_graph, args=([1, 2, 3],)).start()
time.sleep(5)
print("exiting main")
os._exit(0) # this exits immediately with no cleanup or buffer flushing
Uruchomienie file.py
powoduje wyświetlenie okna figury, a następnie __main__
wyjście, ale okno figury multiprocessing
+ matplotlib
pozostaje responsywne dzięki przyciskom powiększania, przesuwania i innym przyciskom, ponieważ jest to niezależny proces.
Sprawdź procesy w wierszu polecenia bash za pomocą:
ps ax|grep -v grep |grep file.py
ion()
rozwiązuje problem.