一次搞懂 DotNetPy:.NET 与 Python 互操作新范式
在企业级开发这块儿,.NET 在业务系统里是主力,Python 则在数据科学、机器学习那边称王。要是能把这两者结合,让 C# 应用直接调用 Python 那些丰富的生态(比如 pandas、scikit-learn),同时还能保持 .NET 工具链的清爽,那该多好。但现实是,现有的互操作方案要么依赖臃肿的运行时,要么不支持 .NET Native AOT,要么得折腾复杂的源生成器配置,用起来总是磕磕绊绊。
DotNetPy 就是为了填这个坑来的。它的 0.5.0 版本已经发布在 NuGet 上了,提供了一种轻量又现代化的 .NET 和 Python 互操作方案①。
什么是 DotNetPy?
DotNetPy(读作 “dot-net-pie”)是一个 .NET 库,能让 C# 直接执行 Python 代码。它把 Python 的 C API 封装了一下,提供了一套干净的托管接口,不需要外部脚本文件,也不用复杂的构建步骤。
来个完整的“Hello World”感受一下:
var executor = Python.GetInstance();
var temperatures = new[] { 23.5, 19.2, 31.8, 27.4, 22.1 };
using var result = executor.ExecuteAndCapture(@"
import statistics
result = {'mean': statistics.mean(data), 'stdev': statistics.stdev(data)}
", new Dictionary<string, object?> { { "data", temperatures } });
Console.WriteLine($"Mean: {result?.GetDouble("mean"):F1}°C ± {result?.GetDouble("stdev"):F1}");
这段代码直接在 C# 里内嵌了 Python 脚本,通过字典把 .NET 数组传进去,然后安全地把计算结果拿回来。全程不用建 .py 文件,也不用配项目,干净利落②。
为啥还需要一个新的互操作库?
虽说已经有 pythonnet、CSnakes、IronPython 这些方案,但它们都没跟上 .NET 2025+ 的发展节奏。DotNetPy 从三个根上重新设计,填补了空白:
1. 原生支持 Native AOT
DotNetPy 是目前唯一支持 PublishAot=true 的 .NET-Python 互操作库。这意味着你能构建完全自包含、不用 JIT 的 AOT 编译应用,而 pythonnet 和 CSnakes 都还不支持这个特性③。
2. 兼容 .NET 10+ 文件级应用
.NET 10 引入了“单文件脚本”模式(dotnet run script.cs),连 .csproj 都不用建。DotNetPy 从一开始就考虑到了这个场景:
# 直接跑,不用项目文件
dotnet run my-analysis.cs
这样一来,它就成了写脚本、做原型验证、搞轻量自动化的利器④。
3. 声明式 uv 集成
以前得手动管 Python 环境,老容易出“在我机器上能跑”的尴尬。DotNetPy 内置了对 uv(一个高性能 Python 包管理器)的支持,可以在 C# 里直接声明环境依赖:
using var project = PythonProject.CreateBuilder()
.WithProjectName("my-analysis")
.WithPythonVersion(">=3.10")
.AddDependencies("numpy>=1.24.0", "pandas>=2.0.0")
.Build();
await project.InitializeAsync(); // 自动下载 Python、建虚拟环境、装包
var executor = project.GetExecutor();
executor.Execute("import numpy as np; print(np.mean([1,2,3]))");
就这么一次调用,环境就全准备好了,再也不用担心环境不一致的问题⑤。
和其他方案比比看
|
特性 |
DotNetPy |
pythonnet |
CSnakes |
IronPython |
|---|---|---|---|---|
|
Native AOT 支持 |
✅ |
❌ |
❌ |
❌ |
|
文件级应用 |
✅ |
❌ |
❌ |
❌ |
|
源生成器依赖 |
否 |
否 |
是 |
否 |
|
uv 集成 |
内置 |
无 |
支持 |
无 |
|
双向调用 |
C# → Py |
C# ↔ Py |
C# → Py |
C# ↔ Py |
|
学习曲线 |
极低 |
中等 |
高 |
低 |
DotNetPy 的目标很明确,就是针对 C# 做主、Python 当工具 的场景。要是你需要 Python 回调 .NET 对象,那 pythonnet 还是更合适的选择⑥。
内置安全机制
动态执行代码总得小心注入风险。DotNetPy 在编译期用 Roslyn 分析器帮你盯着潜在的危险:
// ❌ 分析器会提醒:用户输入直接当代码使,危险!
executor.Execute(userInput);
// ✅ 安全的做法:用户数据作为变量传进去
executor.Execute(
"result = sum(numbers)",
new Dictionary<string, object?> { { "numbers", userNumbers } }
);
这么设计,安全的路子清晰明了,危险的操作一眼就能看出来⑦。
核心功能一览
-
自动找 Python:跨平台检测装好的 Python;
-
数据封送:.NET 的数组、字典、基础类型和 Python 之间能双向转换;
-
变量管理:可以在 C# 里捕获、检查、删除 Python 变量;
-
支持无 GIL:自动识别 Python 3.13+ 的
--disable-gil构建; -
线程安全:自动管好 GIL,支持并发访问⑧。
快速上手
装 NuGet 包:
dotnet add package DotNetPy --version 0.5.0
初始化然后执行:
using DotNetPy;
// 自动找 Python
Python.Initialize(PythonDiscovery.FindPython());
var executor = Python.GetInstance();
var sum = executor.Evaluate("sum([1,2,3,4,5])")?.GetInt32();
Console.WriteLine(sum); // 输出:15
典型应用场景
-
AI/ML 集成:在 .NET 服务里调 scikit-learn、PyTorch 模型;
-
数据分析脚本:内联执行 pandas/numpy 计算,不用单独起 Python 服务;
-
自动化脚本:用 .NET 10 的文件级应用,给脚本配上 Python 能力;
-
老系统改造:在现有 .NET 应用里慢慢引入 Python 功能⑨。
未来规划
接下来计划支持 Windows 嵌入式 Python(部署更简单),还会针对 AI 和数据科学做专门的优化。当前 v0.5.0 版本的 API 已经比较稳了,社区的反馈特别重要⑩。
技术生态关系图

这张图想说的是:DotNetPy 在 .NET 和 Python 生态之间,铺了一条轻量、现代化、C#主导的集成路,特别适合 .NET 当主应用、Python 当计算工具的场景。
最后说几句
DotNetPy 不是要取代所有 Python 互操作方案,而是给特定场景(Native AOT、脚本化、安全隔离)提供最优解。对于想在 .NET 里顺手用上 Python 数据科学生态的开发者来说,它确实是一条低摩擦、高安全的新路子。
参考资料
① DotNetPy GitHub Repository. Introducing DotNetPy. https://github.com/rkttu/dotnetpy
② Microsoft. .NET 10 File-based Apps. https://learn.microsoft.com/en-us/dotnet/core/tutorials/file-scoped-apps
③ Microsoft. Native AOT in .NET 8. https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/
④ Astral. uv: A Fast Python Package Installer. https://docs.astral.sh/uv/
⑤ Microsoft. Security in .NET Source Generators. https://learn.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/source-generators-overview
⑥ pythonnet. Python.NET Documentation. https://pythonnet.github.io/
⑦ Microsoft. Roslyn Analyzers for Security. https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/security-warnings
⑧ Python Software Foundation. Free-threaded Python (PEP 703). https://peps.python.org/pep-0703/
⑨ Microsoft. AI Integration in .NET. https://learn.microsoft.com/en-us/dotnet/machine-learning/⑩ Apache Software Foundation. Apache License 2.0. https://www.apache.org/licenses/LICENSE-2.0
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)