Le PO pose des questions sur le détachement des matplotlib
parcelles. La plupart des réponses supposent l'exécution de commandes à partir d'un interpréteur python. Le cas d'utilisation présenté ici est ma préférence pour tester le code dans un terminal (par exemple bash) où unfile.py
est exécuté et vous voulez que le ou les tracés apparaissent mais que le script python se termine et revienne à une invite de commande.
Ce fichier autonome permet multiprocessing
de lancer un processus distinct de traçage des données avec matplotlib
. Le thread principal se termine en utilisant le os._exit(1)
mentionné dans ce post. Les os._exit()
forces se retirent mais quittent lematplotlib
processus enfant vivant et réactif jusqu'à la fermeture de la fenêtre de tracé. C'est un processus entièrement distinct.
Cette approche est un peu comme une session de développement Matlab avec des fenêtres de figures qui proposent une invite de commande réactive. Avec cette approche, vous avez perdu tout contact avec le processus de la fenêtre de figure, mais c'est correct pour le développement et le débogage. Fermez simplement la fenêtre et continuez à tester.
multiprocessing
est conçu pour l'exécution de code uniquement en python, ce qui le rend peut-être mieux adapté que subprocess
. multiprocessing
est multi-plateforme donc cela devrait bien fonctionner sous Windows ou Mac avec peu ou pas d'ajustement. Il n'est pas nécessaire de vérifier le système d'exploitation sous-jacent. Cela a été testé sur 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'exécution file.py
fait apparaître une fenêtre de chiffre, puis se __main__
ferme, mais la fenêtre de chiffre multiprocessing
+ matplotlib
reste sensible au zoom, au panoramique et à d'autres boutons car c'est un processus indépendant.
Vérifiez les processus à l'invite de commande bash avec:
ps ax|grep -v grep |grep file.py
ion()
résout le problème.