私の質問は簡単です:matplotlibを使用して図を生成するpythonスクリプトがあります。実行するたびに、数字付きの新しいウィンドウが生成されます。前回の実行時に開いていたウィンドウをスクリプトで閉じるにはどうすればよいですか?
matlabの類似のコマンドは、matlabスクリプトの先頭に「すべて閉じる」を配置することです。
私は次のようなことをするためのいくつかの提案を見てきました
import matplotlib.pyplot as plt
plt.close("all")
このソリューションは、pythonシェルからスクリプトを実行する場合に機能します。たとえば、
>>>> execfile("myScript.py")
ただし、Eclipse/PyDevを使用してスクリプトを実行すると、これが機能しないことがわかりました。 Eclipseで機能させるにはどうすればよいですか?
例:
from numpy import *
from matplotlib.pyplot import *
from scipy import *
close("all")
#close any previously open plots - this doesn't work when running via Eclipse
t = linspace(0, 0.1,1000)
w = 60*2*pi
figure()
plot(t,cos(w*t))
plot(t,cos(w*t-2*pi/3))
plot(t,cos(w*t-4*pi/3))
show()
これにより、Nice 3相電源の理想的な波形がプロットされます。
matplotlib.pyplot.close
を呼び出すことにより、Figureを閉じることができます。例:
from numpy import *
import matplotlib.pyplot as plt
from scipy import *
t = linspace(0, 0.1,1000)
w = 60*2*pi
fig = plt.figure()
plt.plot(t,cos(w*t))
plt.plot(t,cos(w*t-2*pi/3))
plt.plot(t,cos(w*t-4*pi/3))
plt.show()
plt.close(fig)
matplotlib.pyplot.close("all")
を呼び出して、開いているすべての図形を閉じることもできます。
Eclipseの一般的なケースについては、Bi Ricoの回答をご覧ください。
たくさんのウィンドウがあり、それらをすべて閉じるのに苦労しているので、誰でも-私のように-ここに上陸する人にとっては、pythonを殺すだけで効果的です。おそらく、Eclipseを含むほとんどすべての状況で機能します。
私はemacsから60個のプロットを生成し(Eclipseよりもそれを好みます)、スクリプトが終了したと思いました。プロットがipythonからのものではないため、ipythonウィンドウでclose('all')
を実行してもうまくいきませんでした。そこで、pythonプロセスの実行を探しました。
スクリプトを実行しているインタープリターを殺したとき、60のプロットすべてが閉じられました-例えば、
$ ps aux | grep python
rsage 11665 0.1 0.6 649904 109692 ? SNl 10:54 0:03 /usr/bin/python3 /usr/bin/update-manager --no-update --no-focus-on-map
rsage 12111 0.9 0.5 390956 88212 pts/30 Sl+ 11:08 0:17 /usr/bin/python /usr/bin/ipython -pylab
rsage 12410 31.8 2.4 576640 406304 pts/33 Sl+ 11:38 0:06 python3 ../plot_motor_data.py
rsage 12431 0.0 0.0 8860 648 pts/32 S+ 11:38 0:00 grep python
$ kill 12410
Ipython/pylabを強制終了したわけではなく、アップデートマネージャーも強制終了しなかったことに注意してください(アップデートマネージャーを強制終了するのはおそらく悪い考えです)。
すべてのプロットウィンドウだけでなく、実行中の現在のスクリプトを除くpython3と呼ばれるすべてのプロセスを強制終了します。 python3で動作します。そのため、他のpython3スクリプトを実行している場合は終了します。一度に実行するスクリプトは1つだけなので、それは私のために仕事をします。
import os
import subprocess
subprocess.call(["bash","-c",'pyIDs=($(pgrep python3));for x in "${pyIDs[@]}"; do if [ "$x" -ne '+str(os.getpid())+' ];then kill -9 "$x"; fi done'])