O OP pergunta sobre a retirada de matplotlib
parcelas. A maioria das respostas pressupõe a execução de comandos de um interpretador python. O caso de uso apresentado aqui é a minha preferência para testar o código em um terminal (por exemplo, bash) em que a file.py
é executado e você deseja que o gráfico apareça, mas o script python seja concluído e retorne ao prompt de comando.
Esse arquivo independente usa multiprocessing
para iniciar um processo separado para plotagem de dados matplotlib
. O thread principal sai usando o os._exit(1)
mencionado neste post. As os._exit()
forças principais saem, mas deixam o matplotlib
processo filho vivo e responsivo até que a janela da plotagem seja fechada. É um processo completamente separado.
Essa abordagem é um pouco como uma sessão de desenvolvimento do Matlab com janelas de figuras que vêm com um prompt de comando responsivo. Com essa abordagem, você perdeu todo o contato com o processo da janela de figuras, mas tudo bem para desenvolvimento e depuração. Apenas feche a janela e continue testando.
multiprocessing
foi desenvolvido para execução de código somente em python, o que talvez o torne mais adequado subprocess
. multiprocessing
é multiplataforma, portanto, isso deve funcionar bem no Windows ou Mac com pouco ou nenhum ajuste. Não há necessidade de verificar o sistema operacional subjacente. Isso foi testado no 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
A execução file.py
exibe uma janela de figura e __main__
sai, mas a janela de figura multiprocessing
+ matplotlib
permanece responsiva com zoom, pan e outros botões porque é um processo independente.
Verifique os processos no prompt de comando bash com:
ps ax|grep -v grep |grep file.py
ion()
corrige o problema.