首页 > 解决方案 > 在 Jupyter 上启动 python 脚本作为后台作业

问题描述

我正在尝试在Jupiter notebook*.py中将文件作为后台服务运行。

from IPython.lib import backgroundjobs as bg
jobs = bg.BackgroundJobManager()
jobs.new(%run -i "script.py") # Not working
jobs.new("script.py") # Not working

标签: pythonjupyter

解决方案


Ipython/Jupyter 后台作业旨在运行纯代码到eval(字符串)或函数。不支持文件和 ipython 魔术命令。

您可以做的一件事是简单地读取文件内容并将其传递给eval

from IPython.lib.backgroundjobs import BackgroundJobFunc

with open('script.py') as code:
    job = BackgroundJobFunc(exec, code.read())

result = job.run()

BackgroundJobManager几乎相同,但有点“更聪明”。

旁注:此接口背后的所有后台机器都在同一进程的线程中运行,并共享解释器状态和输出。所以,请记住:

  • 这不适合计算量大的脚本
  • 永远不要以这种方式运行不受信任的代码——这适用于eval整体,但在这种情况下,您可能会遇到永远无法让 GIL 回到“前端”线程的情况
  • 避免使用标准输出的脚本,这些脚本很可能会与您的主线程密切相关

推荐阅读