2015-01-21 3 views
0

... открывает мой Sublime Text, но когда я что-то вхожу и закрываю файл, я не получаю никаких выходных данных и ошибок, а просто пустую строку (на Python 2). И да, программа ждет, пока я закончу писать.Чтение Python из tempfile не увенчалось успехом

EDIT:
Я только что обнаружил, что это, вероятно, является проблемой, характерной для Sublime Text так vi, emacs и nano все работает нормально, когда вошел в качестве редактора. Но я все еще удивляюсь, как я мог это решить.

+0

Является редактором строка? В этом случае сам вызов подпроцесса терпит неудачу, так как вы добавите строку и список вместе – thiruvenkadam

+0

Это фактически список. –

ответ

1

В соответствии с разделом «редактирование» вы можете сохранить файл, а затем снова открыть его, это может быть не лучшее решение, и оно не «решает» исходную проблему, но по крайней мере должно работать:

import subprocess 
import tempfile 

editor = ['gedit'] 

with tempfile.NamedTemporaryFile(delete=False) as tmpfile: 
    subprocess.call(editor + [tmpfile.name]) # editor = 'subl -w -n' for example 
    tmpfile.file.close() 
    tmpfile = file(tmpfile.name) 
    print tmpfile.read() 
+0

Да, это работает. Благодарю. –

1

Он работает, если выходной файл записывается непосредственно:

#!/usr/bin/env python 
import subprocess 
import sys 
import tempfile 

editor = [sys.executable, '-c', "import sys;" 
           "open(sys.argv[1], 'w').write('abc')"] 
with tempfile.NamedTemporaryFile() as file: 
    subprocess.check_call(editor + [file.name]) 
    file.seek(0) 
    print file.read() # print 'abc' 

это не выполняется, если редактор пишет в свой собственный временный файл и переименовывает его в конце:

#!/usr/bin/env python 
import subprocess 
import sys 
import tempfile 

editor = [sys.executable, '-c', r"""import os, sys, tempfile 
output_path = sys.argv[1] 
with tempfile.NamedTemporaryFile(dir=os.path.dirname(output_path), 
           delete=False) as file: 
    file.write(b'renamed') 
os.rename(file.name, output_path) 
"""] 
with tempfile.NamedTemporaryFile() as file: 
    subprocess.check_call(editor + [file.name]) 
    file.seek(0) 
    print file.read() #XXX it prints nothing (expected 'renamed') 

Переоформление файл как @Vor suggested помогает:

#!/usr/bin/env python 
import os 
import subprocess 
import sys 
import tempfile 

editor = [sys.executable, '-c', r"""import os, sys, tempfile 
output_path = sys.argv[1] 
with tempfile.NamedTemporaryFile(dir=os.path.dirname(output_path), 
           delete=False) as file: 
    file.write(b'renamed') 
os.rename(file.name, output_path) 
"""] 
try: 
    with tempfile.NamedTemporaryFile(delete=False) as file: 
     subprocess.check_call(editor + [file.name]) 
    with open(file.name) as file: 
     print file.read() # print 'renamed' 
finally: 
    os.remove(file.name) 
Смежные вопросы