我编写了一个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'
我在这里假设文档创建过程是在一个单独的线程中执行的,因此当脚本尝试删除图形文件时,它们仍然被文件管理器标记为打开。
在处理完成之前删除这些图像文件非常重要,因为此处理可能会多次执行,因此临时图像文件很快就会占用太多空间。
在继续删除文件之前,有没有办法让脚本等待所有图像关闭?
答案 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)
可能会返回图片文件对象。如果这是正确的,您可以尝试在完成后返回它返回的每个文件对象。