发送exec()输出到另一个流而不重定向标准输出

时间:2019-02-27 21:09:31

标签: python python-3.x python-3.3

我正在编写一个Sublime Text插件,该插件提供了多个可通过UNIX套接字访问的Python Shell。每个外壳都应充当在其自己的线程上运行的独立REPL。 (不希望这些shell具有自己的进程;共享一个进程是绝对必要的。)

如果代码是用exec()编译的,则内置mode='single'函数会将输出打印到stdout,并且该表达式的计算结果不为None。我需要通过套接字发送此输出。

我知道可以通过patching stdout完成此操作。但是,这在这里不起作用,因为多个控制台可能正在多个线程中运行(加上内置控制台)。

我的想法如下:

  • 尝试使用compile() mode='eval' eval()输入,mode='exec',然后打印结果(如果不是None的话)。如果无法编译,请尝试使用mode='single'而不是sys.stdout
  • 对于每个控制台的线程,将输出流保留在线程本地存储中。使用调用“常规”标准输出之前检查这些流的对象来修补sys
  • 以某种方式为每个控制台提供一个补丁的gcc -c -x c `pkg-config --cflags gio-2.0` myglade.gresource.c

这些似乎不是好主意。有更好的吗?

1 个答案:

答案 0 :(得分:1)

如果您对单一进程一无所知,那么根据您愿意尝试使用CPython实现的晦涩的C级功能的不同,可以尝试研究subinterpreters。据我所知,这些是CPython在单个进程中提供的最高隔离级别,并且它们允许类似的sys.stdout对象之类的东西用于单独的子解释器。