2010-10-30 4 views
4

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

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

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

+0

У меня такая же проблема. Я заметил в некоторых сборках python, после показа фигуры, я могу нажать ctrl-c, чтобы вернуться к интерпретатору >>>, и эта фигура останется в живых. Но другой python строит, когда я нажимаю ctrl-c, он закрывает фигуру и выходит из python. Это зависит от версии matplotlib, которую я использую? – blaylockbk

ответ

2

Это работает для 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() 

При запуске этого сценария (с терминала) на pylab участок отображается. Нажатие Ctrl-C убивает основной скрипт, но сюжет остается.

+0

Я пробовал это с помощью 'if __name__ == '__main __': \ n process = Process (target = main) \ n process.start()', но не повезло. Он ничего не отображает, и когда я нажимаю Ctrl-C, он прерывает оба процесса. – l0b0

+0

Вы используете Windows? – unutbu

+0

Нет, unutbu, Ubuntu :) – l0b0

3

Я бы предложил использовать 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() 
1

Только что открыл этот аргумент в plt.show(). set block = False выведет окно фигуры, продолжит следующий код и сохранит вас в интерпретаторе, когда скрипт закончит (если вы работаете в интерактивном режиме -i).

plt.show(block=False) 
Смежные вопросы