如何在F# Jupyter Notebook中引用其他Notebook的函数?
在F# Jupyter Notebook中引用另一个Notebook函数的可行方案
当然有办法啦!在F# Jupyter Notebook里调用另一个Notebook的函数,其实可以借助F#的脚本特性来实现,下面给你两种实用的方案:
方案一:导出为.fsx脚本后用#load加载(最推荐)
这是最简单可靠的方式,利用F#原生的脚本加载机制:
- 先打开你要引用的目标F# Notebook,在Jupyter界面里点击「File」→「Download as」→「F# Script (.fsx)」,把它导出成F#脚本文件。
- 将导出的
.fsx文件放到当前Notebook所在的同一目录下(如果不在同一目录,要写完整的文件路径)。 - 在当前Notebook的单元格里输入:
运行这个单元格后,目标Notebook里定义的所有函数、类型、变量就都能在当前Notebook里直接调用了。#load "TargetNotebook.fsx" - 举个实际例子:如果目标Notebook里写了
let multiply x y = x * y,加载后你直接写multiply 4 5就能得到20。
方案二:直接读取.ipynb文件执行(适合不想导出的场景)
如果你不想导出脚本,也可以直接解析Jupyter Notebook的JSON结构,提取代码块执行:
- 首先需要安装
Newtonsoft.Json包来解析Notebook的JSON内容,在当前Notebook里运行:#r "nuget: Newtonsoft.Json" - 然后用下面的代码加载目标Notebook的代码:
open System.IO open Newtonsoft.Json // 定义类型匹配Notebook的JSON结构 type NotebookCell = { cell_type: string; source: string list } type Notebook = { cells: NotebookCell list } let loadNotebookCode notebookPath = let jsonContent = File.ReadAllText(notebookPath) let notebook = JsonConvert.DeserializeObject<Notebook>(jsonContent) // 提取所有代码单元格的内容并拼接 let code = notebook.cells |> List.filter (fun cell -> cell.cell_type = "code") |> List.collect (fun cell -> cell.source) |> String.concat "\n" // 执行提取到的代码 fsi.EvalInteraction(code) // 调用函数加载目标Notebook loadNotebookCode "./YourOtherNotebook.ipynb" - 注意:这个方法要确保目标Notebook里的代码没有依赖当前环境缺失的资源,否则可能会抛出运行时错误。
小提示
如果两个Notebook存在依赖冲突,或者目标Notebook里有很多无关代码,优先选方案一,导出脚本时可以删掉不需要的单元格,让加载更高效。
内容的提问来源于stack exchange,提问作者alkasai
相关产品推荐
相关产品推荐

