L'OP chiede informazioni sulla cattura di matplotlib
grafici. La maggior parte delle risposte presuppone l'esecuzione dei comandi da un interprete python. Il caso d'uso presentato qui è la mia preferenza per il test del codice in un terminale (es. Bash) in cui file.py
viene eseguito a e si desidera che vengano visualizzati i grafici ma lo script python viene completato e ritorna al prompt dei comandi.
Questo file autonomo consente multiprocessing
di avviare un processo separato per la stampa dei dati matplotlib
. Il thread principale viene chiuso utilizzando quello os._exit(1)
menzionato in questo post. Le os._exit()
forze continuano ad uscire ma lascia il matplotlib
processo figlio vivo e reattivo fino alla chiusura della finestra della trama. È un processo completamente separato.
Questo approccio è un po 'come una sessione di sviluppo di Matlab con finestre di figure che presentano un prompt dei comandi reattivo. Con questo approccio, hai perso tutti i contatti con il processo di figure window, ma va bene per lo sviluppo e il debug. Chiudi la finestra e continua i test.
multiprocessing
è progettato per l'esecuzione di codice solo per Python che lo rende forse più adatto di subprocess
. multiprocessing
è multipiattaforma, quindi dovrebbe funzionare bene su Windows o Mac con poca o nessuna regolazione. Non è necessario controllare il sistema operativo sottostante. Questo è stato testato su 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
L'esecuzione file.py
fa apparire una finestra di figura, quindi si __main__
chiude ma la finestra di figura multiprocessing
+ matplotlib
rimane reattiva con i pulsanti zoom, pan e altri perché è un processo indipendente.
Controlla i processi al prompt dei comandi di bash con:
ps ax|grep -v grep |grep file.py
ion()
risolve il problema.