如何在不更改内置 sys 模块的情况下执行脚本?

How to exec script without possibly changing the builtin sys module?

我想 exec() 一个带有自定义 sys.path 的脚本,并让它导入模块而不将这些模块缓存到内置 sys.modules.

我不想污染当前的解释器sys.pathsys.modules,因为在多线程环境中,不同的脚本将同时执行。

所以不同的脚本会同时 运行 连接,每个脚本都有不同的路径,导入不同的模块,但名称可能会冲突(这就是为什么它们需要从不同的路径 运行)。

我认为给每个 exec() 一个不同的全局字典就足够了,但内置的 sys 模块实例实际上是在它们之间共享的。

关于如何实现该目标的任何想法?

注意:我不需要完整的沙箱解决方案 - 我的脚本来自可信来源,我只是想同时 运行 它们。

作为 suggested in the comments, I ended up using the multiprocessing 库。每个脚本实际上都是在其自己的 multiprocessing.Process 实例上启动的。该库为每个对象生成另一个 python 解释器进程,因此允许我使用不同的路径和模块,而不会干扰主脚本。子进程的进度通过一个 multiprocessing.Queue 对象与主进程共享。

因为我使用日志处理程序将日志记录写入文件,所以我还使用 logging.handlers.QueueHandler 将这些在子进程上生成的日志记录发送回主进程。然后使用 logging.handlers.QueueListener 对象检索这些记录。

好吧,事实证明这确实很简单。 =)