3

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

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

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

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

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

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

4

1 回答 1

1

正如@Rufflewind在评论中建议的那样,我最终使用了多处理库。每个脚本实际上都是在其自己的multiprocessing.Process实例上启动的。这个库为每个对象生成另一个 python 解释器进程,因此,允许我使用不同的路径和模块,而不会干扰主脚本。子进程的进度由一个multiprocessing.Queue对象与主进程共享。

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

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

于 2015-10-11T22:48:44.170 回答