Вот мое решение, я использовал Thread и Event:
import subprocess
from threading import Thread, Event
def kill_on_timeout(done, timeout, proc):
if not done.wait(timeout):
proc.kill()
def exec_command(command, timeout):
done = Event()
proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
watcher = Thread(target=kill_on_timeout, args=(done, timeout, proc))
watcher.daemon = True
watcher.start()
data, stderr = proc.communicate()
done.set()
return data, stderr, proc.returncode
В действии:
In [2]: exec_command(['sleep', '10'], 5)
Out[2]: ('', '', -9)
In [3]: exec_command(['sleep', '10'], 11)
Out[3]: ('', '', 0)
Это дует в тот же звуковой сигнал, что и ответ @ PeterRincker, но я думаю, что вы должны следовать :help new-filetype-scripts
как описанию (, если ваш тип файла может быть обнаружен только путем проверки содержимого файл ) идеально соответствует вашему варианту использования.
С этим вы помещаете следующее содержание в ~/.vim/scripts.vim
:
if did_filetype() " filetype already set..
finish " ..don't do these checks
endif
if getline(1) =~ '^title:'
setfiletype markdown
endif
Согласно :h new-filetype
части B вы можете сделать что-то вроде следующего:
augroup txt_to_markdown
autocmd!
autocmd BufRead * if &filetype == 'text && getline(1) =~ '^title:' | set filetype=markdown | endif
augroup END