我希望 python 绘制一个绘图,在不阻塞控制流的情况下显示它,并在代码退出后让绘图保持打开状态。这可能吗?
这个和相关主题存在于许多其他线程中(见下文),但我无法让情节既保持开放又非阻塞。例如,如果我在 pyplot.show()
之前使用 pyplot.ion()
,或者如果我使用 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
最佳答案
在 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
应该显示一个绘图并将控制权返回到终端,同时保持绘图显示。
关于python - 代码终止后保持 matplotlib/pyplot 窗口打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15454586/