Отключить окно matplotlib от подпроцесса - PullRequest
5 голосов
/ 30 октября 2010

У меня есть скрипт , который создает график, но скрипт продолжает работать в фоновом режиме, пока окно не закроется.Мне бы хотелось, чтобы оно завершалось сразу после создания окна, чтобы Ctrl-C в оболочке не убивал окно, и чтобы пользователь мог оставить окно открытым и продолжить работу в оболочке без bgэто вручную.Я видел некоторые решения с помощью демонов, но я бы хотел избежать разделения на два сценария.Является ли многопроцессорная обработка самым простым решением или есть что-то более короткое?

Соответствующая команда show() - это последнее, что выполняется сценарием, поэтому мне не нужно сохранятьссылка на окно любым способом.

Редактировать: я не хочу сохранять рисунок в виде файла, я хочу иметь возможность использовать интерактивное окно.По сути то же самое, что и запуск mian ... & в bash

Ответы [ 3 ]

3 голосов
/ 21 марта 2011

Я бы предложил использовать os.fork () как простейшее решение. Это это трюк, который используется в демонах, но он не требует двух скриптов и довольно прост. Например:

import os

proc_num = os.fork()

if proc_num != 0:
    #This is the parent process, that should quit immediately to return to the
    #shell.
    print "You can kill the graph with the command \"kill %d\"." % proc_num
    import sys
    sys.exit()

#If we've made it to here, we're the child process, that doesn't have to quit.
import matplotlib.pyplot as plt
plt.plot([1,2,3],[4,5,6])
plt.show()
3 голосов
/ 04 ноября 2016

Только что обнаружил этот аргумент в plt.show (). Параметр block = False откроет окно рисунка, продолжит следовать коду и оставит вас в интерпретаторе после завершения сценария (если вы работаете в интерактивном режиме -i).

plt.show(block=False)
3 голосов
/ 30 октября 2010

Это работает для Unix:

import pylab
import numpy as np
import multiprocessing as mp
import os

def display():
    os.setsid()
    pylab.show()

mu, sigma = 2, 0.5
v = np.random.normal(mu,sigma,10000)
(n, bins) = np.histogram(v, bins=50, normed=True)
pylab.plot(bins[:-1], n)
p=mp.Process(target=display)
p.start()

Когда вы запускаете этот скрипт (из терминала), отображается график пилаба. Нажатие Ctrl-C убивает основной скрипт, но сюжет остается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...