0

Создание и чтение временного файла

51

Описание проблемы:

Я пытаюсь создать временный файл с помощью модуля tempfile, записать в него данные и затем использовать этот файл в качестве аргумента для выполнения команды. После выполнения команды я хочу закрыть и удалить временный файл. Вот пример кода, который я использую:

import tempfile

temp = tempfile.TemporaryFile()
temp.write(b'Some data')  # Необходимо указать байты
command = (some_command temp.name)  # Здесь возникает проблема с синтаксисом
temp.close()

Однако на данном этапе у меня возникают проблемы с синтаксисом при формировании команды. Кроме того, файл не удается использовать в неподходящем состоянии после записи. Как мне правильно организовать создание временного файла, его использование в команде и последующее удаление?

Спасибо за вашу помощь!

2 ответ(ов)

0

Если вам нужен временный файл с заданным именем, вы можете использовать функцию NamedTemporaryFile. Затем вы сможете обратиться к имени файла через temp.name. Дополнительную информацию можно найти в документации: http://docs.python.org/library/tempfile.html.

0

Попробуйте следующий код:

import tempfile
import commands
import os

commandname = "cat"

f = tempfile.NamedTemporaryFile(delete=False)
f.write(b"oh hello there")
f.close()  # файл не будет удален сразу, потому что мы указали delete=False

res = commands.getoutput("%s %s" % (commandname, f.name))
print(res)
os.unlink(f.name)

Этот код просто выводит содержимое временного файла, но он должен дать вам общее представление о том, как это работает. Обратите внимание, что файл закрывается (f.close()), прежде чем внешний процесс получит к нему доступ. Это важно — оно гарантирует, что все ваши операции записи правильно завершены (и, в Windows, что файл не заблокирован). Экземпляры NamedTemporaryFile обычно удаляются сразу после закрытия, поэтому используется параметр delete=False.

Если вам нужно больше контроля над процессом, вы можете попробовать использовать subprocess.Popen, но, похоже, что commands.getoutput может быть достаточным для ваших целей.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь