7

我希望 python 制作一个绘图,在不阻塞控制流的情况下显示它,并在代码退出后保持绘图打开。这可能吗?

这个和相关主题存在于许多其他线程中(见下文),但我无法让情节保持开放和非阻塞。例如,如果我使用pyplot.ion()before pyplot.show(),或者如果我使用pyplot.show(block=False)然后代码终止时情节关闭。使用python或都是如此ipython。如果重要的话,我在 OS X 10.8.2 (Mountain Lion) 上运行,运行python27ipython27

相关讨论:
pylab matplotlib“show”等到窗口关闭
有没有办法分离matplotlib图以便计算可以继续?
在 Matplotlib 中保持绘图窗口打开
关闭 pyplot 窗口

4

2 回答 2

6

在 Linux 上,您可以通过以下方式分离显示器:

import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
import numpy as np
import os

def detach_display():
    mu, sigma = 0, 0.5
    x = np.linspace(-3, 3, 100)
    plt.plot(x, mlab.normpdf(x, mu, sigma))
    plt.show()    

if os.fork():
    # Parent
    pass
else:
    # Child
    detach_display()

主要过程结束,但情节仍然存在。


尝试#2。这也适用于 Linux;你可以试试看:但不是在 OS X 上。

import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
import numpy as np
import os
import multiprocessing as mp

def detach_display():
    mu, sigma = 0, 0.5
    x = np.linspace(-3, 3, 100)
    plt.plot(x, mlab.normpdf(x, mu, sigma))
    plt.show()

proc = mp.Process(target=detach_display)
proc.start()
os._exit(0)

没有os._exit(0), 主进程块。按 Ctrl-C 会终止主进程,但情节仍然存在。

随着os._exit(0),主要过程结束,但情节仍然存在。


叹。尝试#3。如果您将 matplotlib 调用放在另一个脚本中,那么您可以像这样使用子进程:

显示.py:

import matplotlib.pyplot as plt
import numpy as np
import sys

filename = sys.argv[1]
data = np.load(filename)
plt.plot(data['x'], data['y'])
plt.show()    

测试.py

import subprocess
import numpy as np
import matplotlib.mlab as mlab

mu, sigma = 0, 0.5
x = np.linspace(-3, 3, 100000)
y = mlab.normpdf(x, mu, sigma)
filename = '/tmp/data.npz'
np.savez(filename, x=x, y=y)
proc = subprocess.Popen(['python', '/path/to/show.py', filename])

运行test.py应显示绘图并将控制权返回到终端,同时保持绘图显示。

于 2013-03-16T20:57:16.360 回答
-1

尽管这可能无法直接回答问题,但我发现最简单实用的方法是(使用 show(block=False) 并)在后台运行脚本。这样,情节仍然存在,您将返回 shell 提示符,并且在您终止情节窗口时脚本退出...

于 2015-10-28T16:49:15.893 回答