从子进程中分离matplotlib窗口

时间:2010-10-30 12:47:49

标签: python matplotlib

我有一个script创建了一个图表,但脚本一直在后台运行,直到窗口关闭。我希望它一旦创建窗口就退出,这样shell中的Ctrl-C就不会杀死窗口,这样用户就可以打开窗口并继续在shell中工作而不用{{1手动操作。我已经看过一些带守护进程的解决方案,但我想避免将其拆分为两个脚本。 multiprocessing是最简单的解决方案,还是有更短的解决方案?

相关的bg命令是脚本执行的最后一件事,所以我不需要以任何方式保持对窗口的引用。

编辑:我不想将图形保存为文件,我希望能够使用交互式窗口。与在bash中运行show()基本相同

3 个答案:

答案 0 :(得分:3)

适用于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会杀死主脚本,但图表仍然存在。

答案 1 :(得分: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()

答案 2 :(得分:3)

刚刚在plt.show()中发现了这个参数。设置块= False将弹出图形窗口,继续执行代码,并在脚本完成后让您进入解释器(如果您以交互模式-i运行)。

plt.show(block=False)