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

3
我想使用自定义的sys.path执行脚本,并允许它导入模块,但不要将这些模块缓存到内置的sys.modules中,因为在多线程环境中会同时执行不同的脚本,所以我不想污染当前解释器的sys.pathsys.modules。因此,不同的脚本将同时运行,每个脚本都有不同的路径,导入不同的模块,但可能具有冲突的名称(这就是它们需要从不同路径运行的原因)。我认为给每个exec()提供一个不同的全局字典就足够了,但内置的sys模块实例实际上是共享的。您有什么想法可以实现吗?注意:我不需要完整的沙箱解决方案-我的脚本来自可信源,我只想同时运行它们。

1
可能更容易的方法是生成一个新的Python进程并更改PYTHONPATH - Rufflewind
那种方法的问题在于我需要通过注册一些回调函数来监视脚本的执行。 - obelloc
2
你可以使用 multiprocessing - Rufflewind
1
@Rufflewind,太好了!抱歉回复晚了,我需要时间学习多进程库并更改我的解决方案以使用它。如果您想将此评论编写为答案,我可以正确标记它。 - obelloc
2
@NCrawl:正如Mikko所建议的那样,您可以自己回答这个问题,并展示一些您用来完成它的代码。由于我的只是一个建议,我实际上没有什么实质性的东西要添加。 - Rufflewind
显示剩余2条评论
1个回答

1
正如评论中@Rufflewind所建议的那样,我最终使用了multiprocessing库。实际上,每个脚本都在自己的multiprocessing.Process实例上启动。该库为每个对象生成另一个Python解释器进程,因此允许我使用不同的路径和模块,而不会干扰主脚本。子进程的进度通过multiprocessing.Queue对象与主进程共享。
由于我使用日志处理程序将日志记录写入文件,因此我还使用了logging.handlers.QueueHandler将这些在子进程中生成的日志记录发送回主进程。然后,这些记录使用logging.handlers.QueueListener对象进行检索。
嗯,事实证明这实际上非常简单。=)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接