OP ถามเกี่ยวกับการแยกmatplotlib
แปลง คำตอบส่วนใหญ่ถือว่าคำสั่งดำเนินการจากภายในล่ามหลาม กรณีใช้งานที่นำเสนอในที่นี้คือค่ากำหนดของฉันสำหรับการทดสอบโค้ดในเทอร์มินัล (เช่นทุบตี) ที่มีการfile.py
รันและคุณต้องการให้พล็อตเกิดขึ้น แต่สคริปต์ python จะทำงานให้เสร็จสมบูรณ์
ไฟล์แบบสแตนด์อะโลนนี้ใช้เพื่อเปิดเป็นกระบวนการที่แยกต่างหากสำหรับข้อมูลที่มีพล็อตmultiprocessing
matplotlib
เธรดหลักออกจากการใช้ที่os._exit(1)
กล่าวถึงในนี้โพสต์ os._exit()
กองกำลังหลักเพื่อออก แต่ใบmatplotlib
กระบวนการเด็กยังมีชีวิตอยู่และตอบสนองจนกว่าหน้าต่างพล็อตจะปิด มันเป็นกระบวนการที่แยกจากกันโดยสิ้นเชิง
วิธีนี้เปรียบเสมือนเซสชั่นการพัฒนา Matlab ที่มีหน้าต่างตัวเลขที่มาพร้อมกับพรอมต์คำสั่งที่ตอบสนองได้ ด้วยวิธีการนี้คุณสูญเสียการติดต่อกับกระบวนการหน้าต่างตัวเลขทั้งหมด แต่ก็ไม่เป็นไรสำหรับการพัฒนาและการดีบัก เพียงปิดหน้าต่างและทำการทดสอบต่อไป
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()
แก้ไขปัญหา