我想exec()为该脚本添加一个带有自定义sys.path
的脚本,并让它导入模块而不将这些模块缓存到内置sys.modules
。
我不想污染当前的解释器sys.path
和sys.modules
,因为不同的脚本将在多线程环境中同时执行。
因此,不同的脚本将同时运行,每个脚本具有不同的路径,导入不同的模块,但可能存在冲突的名称(这就是为什么它们需要从不同的路径运行)。
我认为给每个exec()提供一个不同的全局字典就足够了,但内置的sys模块实例实际上是在那之间共享的。
关于如何实现这一目标的任何想法?
注意:我不需要完整的沙盒解决方案 - 我的脚本来自可靠的来源,我只想同时运行它们。
答案 0 :(得分:1)
在评论中建议@Rufflewind,我最终使用了multiprocessing库。每个脚本实际上都是在自己的multiprocessing.Process
实例上启动的。这个库为每个对象产生另一个python解释器进程,因此,允许我使用不同的路径和模块,而不会干扰主脚本。子进程的进度由multiprocessing.Queue
对象与主进程共享。
因为我使用日志处理程序将日志记录写入文件,所以我还使用logging.handlers.QueueHandler
将在子进程上生成的这些日志记录发送回主进程。然后使用logging.handlers.QueueListener
对象检索这些记录。
嗯,事实证明它非常简单。 =)