Я пишу плагин Sublime Text, который предоставляет несколько оболочек Python, доступных через сокеты UNIX.Каждая оболочка должна действовать как автономный REPL, работающий в своем собственном потоке.(Для этих оболочек нежелательно иметь собственные процессы; совместное использование одного процесса является абсолютным требованием.)
Встроенная функция exec()
выводит выходные данные в stdout, если код был скомпилирован с mode='single'
и имеетвыражение, которое не оценивается как None.Вместо этого мне нужно отправить этот вывод через сокет.
Я знаю, что это можно сделать с помощью patching stdout .Однако это не сработает, поскольку несколько консолей могут работать в нескольких потоках (плюс встроенная консоль).
Мои идеи следующие:
- Попробуйте
compile()
введите mode='eval'
, eval()
и напечатайте результат (если не None).Если он не скомпилируется, попробуйте mode='exec'
вместо mode='single'
. - . Для каждого потока консоли сохраните выходной поток в локальном хранилище потока.Патч
sys.stdout
с объектом, который проверяет эти потоки перед вызовом «обычного» стандартного вывода. - Каким-то образом предоставляет исправленный
sys
для каждой консоли.
Это не похожекак отличные идеи.Есть ли лучший?