我正在编写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
以某种方式为每个控制台提供一个已修补的。


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

最佳答案

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

关于python - 发送exec()输出到另一个流而不重定向标准输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54914532/

10-14 17:59
查看更多