Python - tempfile 模块创建了一个无法打开的文件?

Python - tempfile module creates a file that cannot be opened?

我正在使用 tempfile 模块和 imagemagick,当我尝试 运行 此代码时:

width = height = 100
temp_file = tempfile.NamedTemporaryFile()
canvas = "convert -size {}x{} canvas:black {}/canvas.png".format(scale_width, scale_height, temp_file.name)
os.system(canvas)

我收到以下错误:

convert: unable to open image /var/folders/jn/phqf2ygs0wlgflgfvvv0ctbw0009tb/T/tmpeMcIuh/canvas.png': Not a directory @ error/blob.c/OpenBlob/2705. convert: WriteBlob Failed /var/folders/jn/phqf2ygs0wlgflgfvvv0ctbw0009tb/T/tmpeMcIuh/canvas.png' @ error/png.c/MagickPNGErrorHandler/1630.

可能是什么问题? 我只是想创建一个存储在随机生成的临时文件中的黑色图像(分辨率为 100x100)。

谢谢!

你必须离开 /canvas.png 位。 tempfile.NamedTemporaryFile() 创建的临时文件是 /var/folders/jn/phqf2ygs0wlgflgfvvv0ctbw0009tb/T/tmpeMcIuh。因此,将其用作输出文件的父目录会引发 imagemagick 错误。

要通过文件扩展名指定输出格式 PNG,可以使用 suffix 关键字参数创建临时文件:

temp_file = tempfile.NamedTemporaryFile(suffix='.png')

此外,您应该使用 subprocess 模块来 运行 子进程。这样你就不必使用字符串格式化整个命令来传递子进程的参数,例如

subprocess.check_call(['convert',
                       '-size', '{}x{}'.format(scale_width, scale_height),
                       'canvas:black',
                       temp_file.name])

还有一条评论:NamedTemporaryFile() 打开了一个文件描述符,您应该立即将其关闭。文档还声明您负责再次删除该文件。