環境
- Python3.11.2
- Xubntu 22.04
- Windows11 Pro 22H2
やりたいこと
tempfileモジュールを使って一時ファイルを作成したいです。
sample.py
import tempfile
def write_hello_file(file_path:str) -> None:
print(f"{file_path=}")
with open(file_path, mode="w") as f:
f.write("hello")
with tempfile.NamedTemporaryFile() as f:
write_hello_file(f.name)
$ python sample.py
file_path='/tmp/tmp83qptmm7'
起きたこと
Windowsで実行すると、PermissionError
が発生しました。
PS > python sample.py
file_path='C:\\Users\\admin\\AppData\\Local\\Temp\\tmpnlbu7s17'
Traceback (most recent call last):
File "C:\Users\admin\Documents\study\20230328\sample.py", line 11, in <module>
write_hello_file(f.name)
File "C:\Users\admin\Documents\study\20230328\sample.py", line 6, in write_hello_file
with open(file_path, mode="w") as f:
^^^^^^^^^^^^^^^^^^^^^^^^^
PermissionError: [Errno 13] Permission denied: 'C:\\Users\\admin\\AppData\\Local\\Temp\\tmpnlbu7s17'
何が原因か
NamedTemporaryFile
で作成したファイルを2回openしたときの動きは、プラットフォームによって異なるからです。
Whether the name can be used to open the file a second time, while the named temporary file is still open, varies across platforms (it can be so used on Unix; it cannot on Windows).
どのように解決したか
TemporaryDirectory
で一時ディレクトリを作って、そのディレクトリに一時ファイルを作成しました。
with tempfile.TemporaryDirectory() as str_temp_dir:
write_hello_file(f"{str_temp_dir}/temp.txt")
PS > python sample.py
file_path='C:\\Users\\admin\\AppData\\Local\\Temp\\tmp9qgjr91l/temp.txt'
以下のサイトのように、NamedTemporaryFile(delete=False)
を指定して自分で一時ファイルを削除する方法もあります。
ただし、この方法だと一時ファイルを削除し忘れる恐れがあるので、採用しませんでした。