多语言笔记系列:Polyglot Notebooks 混合使用多语言并共享变量
混合使用多语言并共享变量
混合使用多种语言(C#、F#、Powershell、SQL、KQL、Python、Html、JavaScript、JavaScript、Mermaind等语言),是多语言笔记的最大特性,并且支持各语言之间共享变量这一创新功能。
语言及共享变量的支持情况
语言 | 变量共享 |
---|---|
C# | 支持 |
F# | 支持 |
PowerShell | 支持 |
JavaScript | 支持 |
SQL | 支持 |
KQL | 支持 |
Python | 支持 |
R | 支持 |
HTML | 不支持 |
Mermaid | 不支持 |
初始化
//全局初始化
#!import "./Base.ipynb"//共享
using Microsoft.DotNet.Interactive;
using Microsoft.DotNet.Interactive.Commands;
使用 SQL(SQLite为例)
- 引用NuGet包
#r "nuget:Microsoft.DotNet.Interactive.SQLite,*-*"
- 连接 SQL内核(使用
#!connect
魔法命令)
/* 简单使用#!connect sqlite --kernel-name SQLiteSharedKernel --connection-string "Data Source=.\assets\database\study.db;"
*///优化方法
using Microsoft.DotNet.Interactive;
using Microsoft.DotNet.Interactive.Commands;
{//内核名:魔法命令中的内核名,执行后会自动加 sql- 前缀,做为内核名被使用string magicCommandKernelName = "SQLiteSharedKernel";string completeKernelName = "sql-" + magicCommandKernelName;//引入内核:可重复执行if(Microsoft.DotNet.Interactive.Kernel.Root.FindKernelByName(completeKernelName) == null){var connectKernelCode = $"#!connect sqlite --kernel-name {magicCommandKernelName} --connection-string \"{SharedDbConnect.SQLiteConnectionString}\"";await Kernel.Root.SendAsync(new SubmitCode( connectKernelCode, "csharp"));}else{Console.WriteLine($"名为 {completeKernelName} 的内核已存在。需要新内核时,请为--kernel-name参数使用不同的值, 本次执行不做任何更改!");}
}
- 使用SQL内核(SQL语句操作数据库)
#!sql-SQLiteSharedKernel--查询年龄最大的5名学生
SELECT * FROM Student order by Age Desc LIMIT 5;--查询学生总数
SELECT COUNT(*) AS Count FROM Student;
使用 KQL(效果图)
因为环境比较难搭建,用效果图代替。
使用 Raw Value Storage
使用value内核,可以方便的管理共享文本数据。
#!value --name SharedDataFromValueKernel --from-file ./shared/file/data.json
C#
一般使用
var student = new {Id=1, Name="张三",Age=18};
student.Display();
使用Value内核共享的变量
#!set --name fromSharedFileData --value @value:SharedDataFromValueKernelfromSharedFileData.Display();
共享变量
使用C#查询数据库中的数据,共享出来,给其它语言(F#、html、js等使用)
#r "nuget:Microsoft.Data.SqlClient"
#r "nuget:Microsoft.Data.Sqlite"using System.Data;
using System.Data.Common;
using System.Data.SqlTypes;using Microsoft.Data.SqlClient;
using Microsoft.Data.Sqlite;//使用 Ado.Net 从SQLite中获取数据,再共享出去//查询数据
var SharedStudents = new List<Student>();
{DataSet ds = new DataSet();using(var sqlConnection = new SqliteConnection(SharedDbConnect.SQLiteConnectionString)){sqlConnection.Open();var querySql = """SELECT * FROM Student LIMIT 5;""";var cmd = sqlConnection.CreateCommand();cmd.CommandType = CommandType.Text;cmd.CommandText = querySql;using (var reader = await cmd.ExecuteReaderAsync()){//循环输出行数据while (await reader.ReadAsync()){var user = new Student(){Id = reader.GetFieldValue<int>("Id"),Name = reader.GetFieldValue<string>("Name"),Age = reader.GetFieldValue<int>("Age"),};SharedStudents.Add(user);}}sqlConnection.Close();sqlConnection.Dispose();}
}//共享数据:默认SharedStudents已共享,其它语言引用即可
SharedStudents.Display();
F#
简单示例
printfn "Hello World from F#"
使用C#共享数据
#!set --value @csharp:SharedStudents --name SharedStudentsSharedStudents
Powershell
#!powershell
Write-Host "hellow powershell"
使用Python
-
前提:系统要安装Python环境,推荐使用Anaconda安装,直接安装Python也可以
-
作用:使多语言笔记,直接支持 Python语言;
-
连接到 Python 内核
using Microsoft.DotNet.Interactive;
using Microsoft.DotNet.Interactive.Commands;//引入Python内核:使用C# 执行引入语句
if(Kernel.Root.FindKernelByName("pythonkernel2") == null)
{//Console.WriteLine("正在导入Python内核....");var importPythonkernel = "#!connect jupyter --kernel-name pythonkernel2 --kernel-spec python3";await Kernel.Root.SendAsync(new SubmitCode( importPythonkernel, "csharp"));Console.WriteLine("Python内核导入完成");
}
else
{Console.WriteLine("Python内核已经导入");
}
- 使用 Python
# 明确指定内核:优先级高于 "单元格选择的内核"
#!pythonkernel2#!set --value @csharp:SharedStudents --name SharedStudentsprint("你好,我是 Ployglot Notebooks 使用 Python语言内核,打印的内容!")
在 Python 中使用C#共享变量
#!pythonkernel2#!set --value @csharp:SharedStudents --name SharedStudents
print(SharedStudents)
使用 html
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>完整html文档</title>
</head>
<body><div style="color:green"><h2 id="MyTitle">使用Html文档,当然也可以使用Html片断。注意:纯HTML不支持共享变量!</h2><table id="student" border="1" style="color:#fff"><caption>C#共享数据:学生表</caption><thead><tr><th>编号</th><th>姓名</th><th>年龄</th></tr></thead><tbody></tbody></table></div>
</body>
</html>
使用 JavaScript
- 简单使用
console.log("输出js日志");
- 操作html
//改变上面html中h2文本颜色:执行后上面看效果
document.getElementById("MyTitle").style.color = "red";
- 使用C#共享数据,填充数据表格
#!set --value @csharp:SharedStudents --name SharedStudentsInJs// 获取表格的tbody部分
const tableBody = document.querySelector('#student tbody');// 遍历数据数组
SharedStudentsInJs.forEach(item => {// 创建一行const row = document.createElement('tr');// 创建单元格并填入数据const nameCell = document.createElement('td');nameCell.textContent = item.Id;row.appendChild(nameCell);const ageCell = document.createElement('td');ageCell.textContent = item.Name;row.appendChild(ageCell);const jobCell = document.createElement('td');jobCell.textContent = item.Age;row.appendChild(jobCell);// 将该行添加到表格的tbody中tableBody.appendChild(row);
});
HTTP Request
基本请求
### 请求 京东
get https://www.jd.com### 请求QQ
get https://www.qq.com
- 高级请求(使用变量等)
@host=https://www.qq.comget {{host}}
使用 mermaind
stateDiagram-v2[*] --> Activestate Active {[*] --> NumLockOffNumLockOff --> NumLockOn : EvNumLockPressedNumLockOn --> NumLockOff : EvNumLockPressed--[*] --> CapsLockOffCapsLockOff --> CapsLockOn : EvCapsLockPressedCapsLockOn --> CapsLockOff : EvCapsLockPressed--[*] --> ScrollLockOffScrollLockOff --> ScrollLockOn : EvScrollLockPressedScrollLockOn --> ScrollLockOff : EvScrollLockPressed}
stateDiagram-v2
state fork_state <<fork>>[*] --> fork_statefork_state --> State2fork_state --> State3state join_state <<join>>State2 --> join_stateState3 --> join_statejoin_state --> State4State4 --> [*]