ОП спрашивает об отсоединении matplotlib
участков. Большинство ответов предполагают выполнение команды из интерпретатора Python. Представленный здесь вариант использования - это мое предпочтение для тестирования кода в терминале (например, bash), где запущен file.py
, и вы хотите, чтобы сюжет (-ы) появлялись, но скрипт python завершился и вернулся в командную строку.
Этот автономный файл использует multiprocessing
для запуска отдельного процесса построения данных с помощью matplotlib
. Основной поток завершается с использованием os._exit(1)
, упомянутого в this сообщение. os._exit()
заставляет main выйти, но оставляет matplotlib
дочерний процесс активным и реагирующим до тех пор, пока окно графика не будет закрыто. Это совершенно отдельный процесс.
Этот подход немного похож на сеанс разработки Matlab с окнами рисунков, которые открываются с отзывчивой командной строкой. При таком подходе вы потеряли всякий контакт с процессом окна рисунка, но это нормально для разработки и отладки. Просто закройте окно и продолжайте тестирование.
multiprocessing
предназначен для выполнения кода только на Python, что делает его, возможно, лучше подходящим, чем 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
person
Marc Compere
schedule
11.07.2019
ion()
устраняет проблему. - person H. Brandsmeier   schedule 25.09.2011os.fork()
, но имейте в виду, что использованиеos.fork()
может быть непростым, потому что вы создаете новый процесс, копируя старый. - person Trevor Boyd Smith   schedule 09.08.2019