Отправить `exec ()` вывод в другой поток без перенаправления stdout - PullRequest
0 голосов
/ 28 февраля 2019

Я пишу плагин Sublime Text, который предоставляет несколько оболочек Python, доступных через сокеты UNIX.Каждая оболочка должна действовать как автономный REPL, работающий в своем собственном потоке.(Для этих оболочек нежелательно иметь собственные процессы; совместное использование одного процесса является абсолютным требованием.)

Встроенная функция exec() выводит выходные данные в stdout, если код был скомпилирован с mode='single' и имеетвыражение, которое не оценивается как None.Вместо этого мне нужно отправить этот вывод через сокет.

Я знаю, что это можно сделать с помощью patching stdout .Однако это не сработает, поскольку несколько консолей могут работать в нескольких потоках (плюс встроенная консоль).

Мои идеи следующие:

  • Попробуйте compile() введите mode='eval', eval() и напечатайте результат (если не None).Если он не скомпилируется, попробуйте mode='exec' вместо mode='single'.
  • . Для каждого потока консоли сохраните выходной поток в локальном хранилище потока.Патч sys.stdout с объектом, который проверяет эти потоки перед вызовом «обычного» стандартного вывода.
  • Каким-то образом предоставляет исправленный sys для каждой консоли.

Это не похожекак отличные идеи.Есть ли лучший?

1 Ответ

0 голосов
/ 28 февраля 2019

Если вам не терпится иметь один процесс, то в зависимости от того, насколько вы готовы погрузиться в неясные возможности уровня C в реализации CPython, вы можете попробовать субинтерпретаторы .Насколько мне известно, это самый высокий уровень изоляции, который CPython обеспечивает в одном процессе, и они позволяют такие вещи, как отдельные sys.stdout объекты для отдельных субинтерпретаторов.

...