Ответ 1
Прежде всего, вам не нужно создавать NamedTemporaryFile
для использования make_archive
; все, что вы хотите, это уникальное имя файла для создаваемого файла make_archive
.
.write
не возвращает имя файла
Чтобы сфокусироваться на этой ошибке: вы считаете, что возвращаемое значение f.write
- это имя файла, которое вы можете открыть; просто попробуйте начать свой файл и прочитайте вместо этого:
f.write(make_archive(f.name, 'zip', root_dir))
f.seek(0)
data = f.read()
Обратите внимание, что вам также потребуется очистить созданный временный файл (вы установили delete=False
):
import os
f.close()
os.unlink(f.name)
В качестве альтернативы просто опустите ключевое слово delete
, чтобы оно по умолчанию было True
снова, и только после этого закройте файл, не нужно отсоединяться.
Это только что написал имя файла архива в новый файл.
Вы просто записываете новое имя архива в свой временный файл. Вам будет лучше просто прочитать архив напрямую:
data = open(make_archive(f.name, 'zip', root_dir), 'rb').read()
Обратите внимание, что теперь ваш временный файл вообще не записывается.
Лучший способ сделать это
Избегайте создания NamedTemporaryFile
в целом: используйте tempfile.mkdtemp()
вместо этого, чтобы создать временный каталог для размещения вашего архива, затем очистить после чего:
tmpdir = tempfile.mkdtemp()
try:
tmparchive = os.path.join(tmpdir, 'archive')
root_dir = "something"
data = open(make_archive(tmparchive, 'zip', root_dir), 'rb').read()
finally:
shutil.rmtree(tmpdir)