2015-02-09 5 views
4

У меня возникла проблема с созданием временного файла и последующим его выполнением. Мой процесс кажется простым: - создать временный файл с tempfile.NamedTemporaryFile - написать инструкцию Баш в файл - начать подпроцесс, чтобы выполнить созданный файлpython создает временный файл namedtemfile и вызывает подпроцесс вызова

Вот реализация:

from tempfile import NamedTemporaryFile 
import os 
import subprocess 

scriptFile = NamedTemporaryFile(delete=True) 
with open(scriptFile.name, 'w') as f: 
    f.write("#!/bin/bash\n") 
    f.write("echo test\n") 
    os.chmod(scriptFile.name, 0777) 

subprocess.check_call(scriptFile.name) 

I получите OSError: [Errno 26] Text file busy по подпроцессу check_call. Как использовать файл temp для его выполнения?

+1

закрыть файл? – jester112358

+0

dumb me ... Я ожидал контекста 'with', чтобы закрыть файл для меня, что не так. – jeromes

+0

'' NamedTemporaryFile'' уже открывает файл (см. Https://docs.python.org/2/library/tempfile.html), поэтому я удивлен, что ошибка не возникла в контекст-менеджере. Кроме того, аргумент '' delete = True'' удаляет файл при закрытии соединения, что делает его особенно полезным для его использования позже в подпроцессе. – MrGumble

ответ

4

Как указано в jester112358, требуется только, чтобы файл был закрыт. я ожидал, что с контекстом, чтобы сделать это для меня: \

Вот исправление

from tempfile import NamedTemporaryFile 
import os 
import subprocess 

scriptFile = NamedTemporaryFile(delete=True) 
with open(scriptFile.name, 'w') as f: 
    f.write("#!/bin/bash\n") 
    f.write("echo test\n") 

os.chmod(scriptFile.name, 0777) 
scriptFile.file.close() 

subprocess.check_call(scriptFile.name)