OP는 matplotlib
플롯 분리 에 대해 묻습니다 . 대부분의 답변은 파이썬 인터프리터 내에서 명령 실행을 가정합니다. 여기에 제시된 유스 케이스는 터미널 file.py
이 실행되고 (예 : bash) 코드가 테스트 되고 플롯이 나타나지만 파이썬 스크립트가 완료되고 명령 프롬프트로 돌아 가기를 원합니다.
이 독립형 파일은 multiprocessing
로 데이터를 플로팅하기위한 별도의 프로세스를 시작하는 데 사용 됩니다 matplotlib
. 이 글 에서 os._exit(1)
언급 한 내용에 따라 메인 스레드가 종료됩니다 . main 은 강제로 종료하지만 플롯 창이 닫힐 때까지 자식 프로세스를 활성 상태로 유지합니다. 완전히 별도의 프로세스입니다.os._exit()
matplotlib
이 접근 방식은 반응 형 명령 프롬프트가 표시되는 그림 창을 가진 Matlab 개발 세션과 약간 비슷합니다. 이 방법을 사용하면 Figure 창 프로세스와의 모든 연결이 끊어졌지만 개발 및 디버깅에 적합합니다. 창을 닫고 테스트를 계속하십시오.
multiprocessing
파이썬 전용 코드 실행을 위해 설계되었으므로보다 더 적합합니다 subprocess
. multiprocessing
크로스 플랫폼이므로 조정이 거의 또는 전혀없이 Windows 또는 Mac에서 제대로 작동합니다. 기본 운영 체제를 확인할 필요가 없습니다. 이것은 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
실행 file.py
하면 그림 창이 나타나고 __main__
종료되지만 multiprocessing
+ matplotlib
그림 창이 독립적 인 프로세스이므로 확대 / 축소, 이동 및 기타 버튼으로 계속 반응합니다.
bash 명령 프롬프트에서 다음을 사용하여 프로세스를 확인하십시오.
ps ax|grep -v grep |grep file.py
ion()
켜면 문제가 해결됩니다.