0

一連のグラフを生成し、グラフを含むPDFレポートを生成するPythonスクリプトを作成しました。これはサーバー上で生成されることを目的としています。ReportLabを使用してPDFを生成しています。スクリプトは、Windows7を実行しているマシンで実行されています。

スクリプトの最初に、ReportLabフローアブルを保存するためのリストと各図のパスを保存するためのリストが設定されています。

Story = []
FigList = []

各グラフはMatplotlibを使用して生成され、PNGとして保存されます。画像がStoryに追加され、ファイルのパスがFigListに追加されます。

fig = plt.figure(1)
ax = fig.add_subplot(1, 1, 1)
ax.plot(x, y)
fname = "figure.png"
fig.savefig(fname)
FigList.append(fname)
Story.append(Image(fname))

これは、いくつかの画像(合計で約10〜15)に対して繰り返されます。スクリプトの最後に、ドキュメントが作成されます

doc = SimpleDocTemplate("report.pdf",
                        pagesize=A4,
                        rightMargin=cm,
                        leftMargin=cm,
                        topMargin=cm,
                        bottomMargin=cm)

doc.build(Story)

この後、を使用して作成されたすべてのPNGファイルを削除したいと思います

for f in FigList:
    if os.path.exists(f): os.remove(f)

ただし、次のエラーが表示されます

WindowsError:[エラー32]別のプロセスによって使用されているため、プロセスはファイルにアクセスできません:'image.png'

ここでは、ドキュメント作成プロセスが別のスレッドで実行されていると想定しているため、スクリプトがFigureファイルを削除しようとすると、ファイルマネージャーによって開いているとマークされたままになります。

このプロセスは何度も実行される可能性があるため、プロセスが終了する前にこれらのイメージファイルを削除することが重要です。そのため、一時的なイメージファイルはすぐに多くのスペースを占有します。

ファイルの削除に進む前に、すべての画像が閉じられるのをスクリプトに待機させる方法はありますか?

4

2 に答える 2

3

Image(...)この問題は、変数を追加する前に変数に割り当てStory、後で削除することで解決できるように思われます。質問の例を考えると、この変更は次のようになります。

fig = plt.figure(1)
ax = fig.add_subplot(1, 1, 1)
ax.plot(x, y)
fname = "figure.png"
fig.savefig(fname)
FigList.append(fname)
img = Image(fname)
Story.append(img)
del img

注:これは、によって作成されたファイルオブジェクトとは関係ありませんsavefig()

于 2012-06-18T15:02:15.647 に答える
0

withファイルをステートメントで開いてラップしてみましたか?通常、Pythonはwith句を離れた後、ファイルを閉じます。

編集:fig.savefig(fname)画像ファイルオブジェクトを返す可能性があるようです。それが正しければ、完了後に返される各ファイルオブジェクトに対してcloseを呼び出してみることができます。

于 2012-06-12T14:18:56.040 に答える