2016-06-21 56 views
0

我使用的tempfile模塊和imagemagick,當我嘗試運行這段代碼:Python - tempfile模塊創建一個無法打開的文件?

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)存儲在一個隨機生成的臨時文件。

謝謝!

+1

http://stackoverflow.com/questions/30105904/python-subprocess-pipe-an-image-blob-to-imagemagick-shell-command/30109768#30109768 –

+0

@PadraicCunningham我也想過提到,但OP明確指出「隨機生成的臨時文件」。 –

回答

1

您必須離開/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()會打開一個文件描述符,您應立即關閉該文件描述符。該文檔還聲明,您負責再次刪除該文件。

+0

但我怎麼能告訴imagemagick我想要一個.png文件在該位置以某種方式命名? – Gambit2007

+0

'NamedTemporaryFile()'有一個'suffix'關鍵字參數。回答相應編輯。 –

+0

非常感謝! – Gambit2007