求助,Python中schedule模块循环导入pyv8报错且无法继续执行下一步怎么办?

在 python schedule 模块中执行循环,循环中包含了导入 pyv8 模块,报错『*** JSError: JSError: <CALL_AND_RETRY_0> Allocation failed - process out of memory 』; 我试了把导入 pyv8 模块的动作单独放在一个循环中或者单独放在一个 schedule 任务中,都可以正常执行,但放在一起就会出现循环走不下去的情况 测试代码为:

from apscheduler.schedulers.blocking import BlockingScheduler
from pyv8 import PyV8

def test(): print “do” for i in range(1, 10): print i ctxt = PyV8.JSContext()

sched = BlockingScheduler() sched.add_job(test, ‘interval’, seconds=5) sched.start()

运行结果:

$ python leaktest.py
do
1
No handlers could be found for logger "apscheduler.executors.default"
do
1
do
1
do
1
do
1
do
1

请问有人碰到过这种情况吗?有解决方法吗?谢谢


求助,Python中schedule模块循环导入pyv8报错且无法继续执行下一步怎么办?

3 回复

遇到schedule模块和pyv8的循环导入问题,这通常是因为两个模块在初始化时相互依赖,导致Python解释器无法完成导入。解决这个问题的核心思路是打破这个循环依赖。

最常见且有效的方法是使用“延迟导入”(Lazy Import)。具体做法是,不要在模块的顶层作用域(即全局代码)中直接导入有问题的模块,而是将其放在函数或方法内部。这样,导入操作只有在函数被调用时才会执行,从而避免了启动时的循环。

以下是一个针对你情况的代码示例。假设你的主程序文件是 main.py,它同时用到了 schedule 和某个包含 pyv8 的模块(这里假设为 my_pyv8_module)。

# main.py
import schedule
import time

def job_that_uses_pyv8():
    # 在函数内部导入,打破循环依赖
    from my_pyv8_module import do_something_with_v8
    # 调用你的pyv8相关功能
    result = do_something_with_v8()
    print(f"Job executed with result: {result}")

# 安排任务
schedule.every(10).seconds.do(job_that_uses_pyv8)

if __name__ == "__main__":
    while True:
        schedule.run_pending()
        time.sleep(1)

关键点解释:

  1. 延迟导入:将 from my_pyv8_module import ... 这行导入语句移到了 job_that_uses_pyv8() 函数内部。这意味着在 main.py 被首次导入时,my_pyv8_module 不会被立即加载,从而不会与 schedule 的初始化形成循环。
  2. 确保模块路径正确:请将 my_pyv8_module 替换为你实际使用pyv8的那个模块的真实名称。
  3. 检查依赖模块:同样,你需要检查 my_pyv8_module 内部是否在顶层直接导入了 schedulemain.py。如果是,也需要在那边做同样的延迟导入处理,才能彻底打破循环。

如果这样做之后还有问题,可能是更复杂的交叉依赖。另一个备用方案是使用Python的 importlib 库在代码中动态导入模块,但原理和延迟导入类似。

总结一下:用函数封装有冲突的导入语句是最直接的解法。


def test():
print “do”
for i in range(1, 10):
print i
with PyV8.JSLocker():
ctxt = PyV8.JSContext()

修改后有效,十分感谢!

回到顶部