在ReportLab中包含图像后确定图像是否已关闭

时间:2012-06-12 12:21:38

标签: python windows file-io reportlab

我编写了一个Python脚本,它将生成一系列图形,然后生成包含图形的PDF报告。目的是这将在服务器上生成。我正在使用ReportLab生成PDF。该脚本正在运行Windows 7的计算机上运行。

在脚本的开头,设置了一个用于存储ReportLab flowables的列表和一个用于存储每个图形的路径的列表。

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'

我在这里假设文档创建过程是在一个单独的线程中执行的,因此当脚本尝试删除图形文件时,它们仍然被文件管理器标记为打开。

在处理完成之前删除这些图像文件非常重要,因为此处理可能会多次执行,因此临时图像文件很快就会占用太多空间。

在继续删除文件之前,有没有办法让脚本等待所有图像关闭?

2 个答案:

答案 0 :(得分: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()创建的文件对象无关。

答案 1 :(得分:0)

您是否尝试在with声明中打开文件?通常python在离开with子句后为你关闭文件。

编辑:您的fig.savefig(fname)可能会返回图片文件对象。如果这是正确的,您可以尝试在完成后返回它返回的每个文件对象。