Это потому, что content
еще не записано на диск, когда вы выполняете копирование. Это происходит потому, что записи буферизуются и не всегда происходят сразу после вызова file.write
.
Чтобы убедиться, что содержимое записано на диск в данный момент, вы можете использовать file.flush
.
В вашем случае достаточно изменить код на:
def write_file(file_destination: str, content: bytes):
with tempfile.NamedTemporaryFile() as fp:
fp.write(content)
fp.flush()
shutil.copy(fp.name, file_destination)
Для получения дополнительной информации о том, когда содержимое фактически записывается на диск, вы можете ознакомиться с документацией io.BufferedWriter
. Соответствующая часть:
Буфер будет записан в базовый объект RawIOBase
при различных условиях, в том числе:
- когда буфер становится слишком маленьким для всех ожидающих данных;
- когда вызывается flush ();
- при запросе seek () (для объектов BufferedRandom);
- когда объект BufferedWriter закрыт или уничтожен.
Следовательно, в вашем первом примере возможно, что он работает только иногда, потому что в те моменты контент, который вы пишете, превышает буфер и поэтому должен быть немедленно записан.
Вместо этого ваш второй пример работает, потому что при выходе из блока with
файл закрывается, и, следовательно, буфер должен быть очищен и записан на диск.