我正在编写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/