7

Pythonでプロットを作成し、制御フローをブロックせずに表示し、コードが終了した後もプロットを開いたままにしておきたいです。これは可能ですか?

これと関連する主題は他の多くのスレッドに存在しますが (以下を参照)、プロットを開いたままにし、ブロックしないようにすることはできません。たとえば、pyplot.ion()beforeを使用したpyplot.show()場合、または使用pyplot.show(block=False)した場合、コードが終了するとプロットが閉じます。これは、 または のいずれpythonかを使用して当てはまりますipython。問題があれば、私は OS X 10.8.2 (Mountain Lion) で実行python27しています。ipython27

関連する議論:
pylab matplotlib の "show"
は、ウィンドウが閉じるまで待機します
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でも機能します。あなたはそれを試してみるかもしれません:しかしOSXではそうではありません。

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すると、プロットが表示され、プロットを表示したまま、制御を端末に戻す必要があります。

于 2013-03-16T20:57:16.360 に答える
-1

これは質問に直接答えないかもしれませんが、私が見つけた最も簡単な実用的な方法は、(show(block=False) を使用して) スクリプトをバックグラウンドで実行することです。そうすれば、プロットは残り、シェルプロンプトに戻り、プロットウィンドウを強制終了するとスクリプトが終了します...

于 2015-10-28T16:49:15.893 に答える