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

时间:2015-10-08 22:47:18

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

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

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

因此,不同的脚本将同时运行,每个脚本具有不同的路径,导入不同的模块,但可能存在冲突的名称(这就是为什么它们需要从不同的路径运行)。

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

嗯,事实证明它非常简单。 =)