Я написал скрипт Python, который будет генерировать серию графиков, а затем создавать отчет в формате PDF, содержащий графики. Намерение состоит в том, что это будет сгенерировано на сервере. Я использую ReportLab для создания PDF. Сценарий запускается на машине под управлением Windows 7.
В начале сценария задается список для хранения потоков 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»
Я предполагаю, что процесс создания документа выполняется в отдельном потоке, поэтому, когда скрипт пытается удалить файлы рисунков, они по-прежнему помечаются файловым менеджером как открытые.
Важно, чтобы эти файлы изображений были удалены до завершения процесса, так как этот процесс может выполняться много раз, поэтому временные файлы изображений вскоре займут слишком много места.
Есть ли способ заставить скрипт дождаться закрытия всех изображений, прежде чем приступить к удалению файлов?