我正在编写一个小型Flask服务器,该服务器: 1.接收图像并将其保存到临时目录中, 2.进行一些处理以生成修改后的图像,并且 3.发回修改后的图像。
结构可以概括为:
@app.route('/process_file', methods=['POST'])
def process_file():
file = request.files['file']
with tempfile.TemporaryDirectory() as tmpdirname:
file.save(os.path.join(tmpdirname, "original.png"))
# ...
# Do a lot of stuff to produce a new "modified.png", in the same dir
# ...
ret_path = os.path.join(tmpdirname, "modified.png")
return send_file(filename_or_fp=ret_path, mimetype="image/png")
在Linux上,一切正常。
但是,在Windows上,在系统尝试删除临时目录时收到错误消息。
以下是我们在删除临时目录期间遇到的堆栈错误的选择:
File "C:\Users\hapr00\AppData\Local\Programs\Python\Python37\lib\tempfile.py", line 805, in __exit
__
self.cleanup()
File "C:\Users\hapr00\AppData\Local\Programs\Python\Python37\lib\tempfile.py", line 809, in cleanu
p
_shutil.rmtree(self.name)
File "C:\Users\hapr00\AppData\Local\Programs\Python\Python37\lib\shutil.py", line 513, in rmtree
return _rmtree_unsafe(path, onerror)
File "C:\Users\hapr00\AppData\Local\Programs\Python\Python37\lib\shutil.py", line 397, in _rmtree_
unsafe
onerror(os.unlink, fullname, sys.exc_info())
File "C:\Users\hapr00\AppData\Local\Programs\Python\Python37\lib\shutil.py", line 395, in _rmtree_
unsafe
os.unlink(fullname)
PermissionError: [WinError 32] Der Prozess kann nicht auf die Datei zugreifen, da sie von einem ande
ren Prozess verwendet wird: 'path/to/the/modified.png'
英语是这样的:“该进程无法访问文件,因为它已被另一个进程使用。”
我的理解
看起来send_file
是异步的,因此Python试图在另一个线程仍在上传文件的同时删除该临时目录。
在Linux上,这不会发生,因为仅删除了文件名,而文件节点在其他线程完成上传文件之前仍然处于活动状态。
问题: 一个人将如何重新组织代码以正确处理这种情况?
(不,至少在目前,切换到Linux服务器不是解决方案)