我想让python制作一个情节,在不阻挡控制流的情况下显示它,并在代码退出后保持图表打开。这可能吗?
这个以及相关的主题在许多其他主题中存在(见下文),但是我无法让情节保持开放,并且是非阻塞的。例如,如果我在pyplot.ion()
之前使用pyplot.show()
,或者如果我使用pyplot.show(block=False)
,则在代码终止时图表会关闭。使用python
或ipython
都是如此。如果重要,我正在运行OS X 10.8.2(Mountain Lion),运行python27
和ipython27
相关讨论:
pylab matplotlib "show" waits until window closes
Is there a way to detach matplotlib plots so that the computation can continue?
Keep plotting window open in Matplotlib
Closing pyplot windows
答案 0 :(得分: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调用放在另一个脚本中,那么可以使用这样的子进程:
show.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()
test.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
应该显示一个图并将控制返回到终端,同时显示图。
答案 1 :(得分:-1)
虽然这可能不能直接回答这个问题,但我发现最简单的实际问题是(使用show(block = False)并在后台运行脚本)。这样一来,情节仍然存在,你又回到shell提示符下,当你杀死绘图窗口时脚本会退出......