如何在不更改内置 sys 模块的情况下执行脚本?
How to exec script without possibly changing the builtin sys module?
我想 exec() 一个带有自定义 sys.path
的脚本,并让它导入模块而不将这些模块缓存到内置 sys.modules
.
我不想污染当前的解释器sys.path
和sys.modules
,因为在多线程环境中,不同的脚本将同时执行。
所以不同的脚本会同时 运行 连接,每个脚本都有不同的路径,导入不同的模块,但名称可能会冲突(这就是为什么它们需要从不同的路径 运行)。
我认为给每个 exec() 一个不同的全局字典就足够了,但内置的 sys 模块实例实际上是在它们之间共享的。
关于如何实现该目标的任何想法?
注意:我不需要完整的沙箱解决方案 - 我的脚本来自可信来源,我只是想同时 运行 它们。
作为 suggested in the comments, I ended up using the multiprocessing 库。每个脚本实际上都是在其自己的 multiprocessing.Process
实例上启动的。该库为每个对象生成另一个 python 解释器进程,因此允许我使用不同的路径和模块,而不会干扰主脚本。子进程的进度通过一个 multiprocessing.Queue
对象与主进程共享。
因为我使用日志处理程序将日志记录写入文件,所以我还使用 logging.handlers.QueueHandler
将这些在子进程上生成的日志记录发送回主进程。然后使用 logging.handlers.QueueListener
对象检索这些记录。
好吧,事实证明这确实很简单。 =)
我想 exec() 一个带有自定义 sys.path
的脚本,并让它导入模块而不将这些模块缓存到内置 sys.modules
.
我不想污染当前的解释器sys.path
和sys.modules
,因为在多线程环境中,不同的脚本将同时执行。
所以不同的脚本会同时 运行 连接,每个脚本都有不同的路径,导入不同的模块,但名称可能会冲突(这就是为什么它们需要从不同的路径 运行)。
我认为给每个 exec() 一个不同的全局字典就足够了,但内置的 sys 模块实例实际上是在它们之间共享的。
关于如何实现该目标的任何想法?
注意:我不需要完整的沙箱解决方案 - 我的脚本来自可信来源,我只是想同时 运行 它们。
作为 multiprocessing.Process
实例上启动的。该库为每个对象生成另一个 python 解释器进程,因此允许我使用不同的路径和模块,而不会干扰主脚本。子进程的进度通过一个 multiprocessing.Queue
对象与主进程共享。
因为我使用日志处理程序将日志记录写入文件,所以我还使用 logging.handlers.QueueHandler
将这些在子进程上生成的日志记录发送回主进程。然后使用 logging.handlers.QueueListener
对象检索这些记录。
好吧,事实证明这确实很简单。 =)