百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

CSnakes:在.NET项目中嵌入Python代码的工具

liebian365 2025-03-23 20:57 5 浏览 0 评论

在软件开发中,结合不同编程语言的优势往往可以提升项目的性能与可维护性。

CSnakes 是一个.NET源生成器和运行时,旨在将Python代码和库高效嵌入到C#.NET解决方案中。

它的最大优势在于无需REST、HTTP或微服务的架构设计,能够实现快速的代码调用

项目地址:
https://github.com/tonybaloney/CSnakes

系统架构图

特性

  • o 支持.NET 8和9

  • o 支持Python 3.9~3.13

  • o 支持虚拟环境和C扩展

  • o 兼容Windows、macOS和Linux

  • o 紧密集成NumPy的ndarrays与Spans、2D Spans和TensorSpans(.NET 9)

  • o 采用Python的C-API快速调用Python代码

  • o 使用Python类型提示生成与.NET本地类型的函数签名

  • o 支持CPython 3.13的“自由线程”模式

  • o 支持嵌套序列和映射类型(tuple、dict、list)

优势

  • o 使用原生的 Python 类型提示标准,生成干净、可读的 C# 代码,且代码冗余最小。

  • o .NET 与 Python 的集成通过 C-API 实现,这意味着 Python 版本 3.8-3.13 与 .NET 8-9 之间具有良好的兼容性。

  • o 集成为低级且高性能。

  • o CSnakes 使用 CPython C-API,兼容所有 Python 扩展。

  • o Python 代码和库的调用与 .NET 在同一进程中进行。

入门指南

1. 安装Python

CSnakes需要在你的机器上安装Python,支持版本为3.9-3.13。

嵌入Python的过程需要指定三条路径,而不仅仅是Python可执行文件的路径:

  • o Python库路径(通常为python3.dlllibpython3.so

  • o Python标准库路径(包含标准库的目录)

  • o Python代码路径

  • o 可选:虚拟环境路径

为了简化配置,CSnakes提供了常见安装路径的Python定位器作为扩展方法。

2. 配置C#项目

要在C#项目中配置CSnakes,我们需要:

  1. 1. 创建一个新的C#项目或打开现有项目。

  2. 2. 将Python文件添加到项目中。

  3. 3. 在项目文件中将Python文件标记为“附加文件”。

  4. 4. 安装CSnakes.Runtime NuGet包。

  5. 5. 创建一个Python环境并实例化Python模块。

3. 安装NuGet包

CSnakes包含在一个名为CSnakes.Runtime的NuGet包中。该包包括源生成器和运行时库。

强烈建议使用源生成器以获得最佳体验,但你也可以直接使用运行时库。

4. 添加Python文件

CSnakes使用Python的类型注解生成C#代码。

需要将Python文件添加到项目中,并为想要从C#调用的函数添加类型注解。

例如,我们可以创建一个名为demo.py的文件,其内容如下:

def hello_world(name: str) -> str:
return f"Hello, {name}!"

5. 标记文件以供生成

要使CSnakes对Python文件运行源生成器,需要在CSProj文件的XML中将其标记为“附加文件”:

<ItemGroup>
<AdditionalFiles Include="demo.py">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</AdditionalFiles>
</ItemGroup>

或者在Visual Studio中更改文件的属性,将“生成操作”设置为“Csharp分析器附加文件”。

6. 构建项目

添加Python文件、安装NuGet包并标记文件后,可以使用以下命令构建项目:

dotnet build

7. 从C#构建Python环境

CSnakes创建的Python环境是进程级单例,我们可以在整个进程生命周期中使用它。

CSnakes提供了一个主机生成器,便于在C#代码中创建Python环境。

以下是创建Python环境的示例代码:

using CSnakes.Runtime;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.IO;

var builder = Host.CreateDefaultBuilder(args)
.ConfigureServices(services =>
{
var home = Path.Join(Environment.CurrentDirectory, "."); // Python模块路径
services
.WithPython()
.WithHome(home)
.FromNuGet("3.12.4"); // 添加一个或多个Python定位器
});

var app = builder.Build();
var env = app.Services.GetRequiredService();

8. 使用虚拟环境

CSnakes支持在Python虚拟环境和Conda环境中执行,因为大多数Python项目需要外部依赖。

我们可以使用.WithVirtualEnvironment()方法指定虚拟环境的路径。

如果需要,我们还可以使用.WithPipInstaller()方法在虚拟环境中安装requirements.txt文件中列出的包。

示例代码如下:

services
.WithPython()
.WithVirtualEnvironment(Path.Join(home, ".venv"))
.WithPipInstaller(); // 可选 - 启动时安装requirements.txt中的包

9. 从C#.NET调用CSnakes代码

一旦创建了Python环境,我们就可以使用IPythonEnvironment接口从C#调用任何Python函数。

以下是调用demo.py文件中hello_world函数的示例代码:

var env = app.Services.GetRequiredService();
var module = env.Demo();
var result = module.HelloWorld("DHub");
Console.WriteLine(result);

// 输出:Hello, DHub!

结语

CSnakes为.NET开发者提供了强大且灵活的工具,可以在项目中无缝集成Python代码,提升应用的功能与性能。

通过简化Python与.NET的交互过程,CSnakes为开发者创造了更高效的开发体验,值得在未来的项目中深入探索与应用。

相关推荐

深度解密epoll 如何工作的?(epoll基本处理流程)

epoll...

大乐透第19082期:头奖开出7注1000万分落六地 奖池41亿元

2019年7月17日晚开奖的体彩超级大乐透第19082期开奖号码为:前区06、18、20、21、31,后区03、04。本期大乐透前区号码五区比为1:0:3:0:1,二区和四区号码没有给出。当期前区和值...

【开奖】4月27日周六:福彩、体彩(2021年4月27日体彩开奖结果)

4月27日开奖福彩3D第2019110期:61222选5第2019110期:0812202122排列3第19110期:303排列5第19110期:30305大乐透第19047期:0304...

“红狒狒”落户哈尔滨铁路局(哈尔滨铁路红肠)

这几天,“红人”“红狒狒”在牡丹江机务段可引起了不小的轰动,众粉丝争相与其拍照留念,在该段人气爆棚!“红狒狒”到底何许人也?“红狒狒”,中文名:和谐3D型电力机车;绰号:红狒狒、番茄;制造商:大连机...

2D、3D、2.5D,做游戏还是搞噱头?玩家都晕了

前言游戏类型就像某种潮流,一种流行罢,另一种接棒成为主流。前两年的新作大多以“开放世界”为标签,在追求纯沙盒的过程中打造出一些细致的分类,比如说“类GTA沙盒”。诚然,纯碎的沙盒游戏并不多见,业内只有...

《战神4》PC版宣传片发布 GTX 1070即可60帧畅玩

在今年10月的时候索尼PlayStation官方正式宣布圣莫尼卡2018年的《战神4》将于2022年1月14日推出PC版本,官方在今天公布了一段PC版宣传片,并且公开了游戏的配置需求。下面让我们一起来...

男星深情好丈夫形象崩塌,半夜搂美女坐大腿,举止亲密

近日,于晓光被拍到深夜在酒吧玩,结束后与一名女子一起上车离开。上车后,女子直接坐在了他腿上,他也顺势搂着美女,美女满脸笑容地坐在他腿上玩手机离开。可能有人会好奇,于晓光是谁呢?于晓光是韩国艺人秋瓷炫的...

d3d12dll丢失怎么修复?d3d12dll加载失败怎么解决?

  d3d12.dll丢失怎么修复?d3d12.dll加载失败怎么解决?很多朋友想要运行游戏的时候都会遇到这个问题,这种情况该怎么办呢?今天系统之家小编给朋友们讲讲具体的解决方法,操作其实还蛮简单的。...

许多玩家反馈《生化4RE》PC一直崩溃 无法进入游戏

今日(3月24日),卡普空《生化危机4:重制版》正式发售,然而有部分PC玩家遇到了游戏崩溃等问题。很多玩家在贴吧发帖称游戏遇到了严重的崩溃问题,且经常反复,报错代码普遍为FatalD3Derror...

微软正式推出适用于WSL Linux的D3D12 GPU视频加速技术

今天,微软正式向WindowsSubsystemforLinux(WSL)用户发布了Direct3D12GPU视频加速支持。在微软通过WSL允许在Linux下使用Open...

《怪物猎人:崛起》曙光系统报错“Fatal d3d error”的解决办法

《怪物猎人:崛起》曙光系统报错“Fatald3derror”的解决办法不少小伙伴反应《怪物猎人:崛起》DLC曙光预载以后打不开游戏,出现了Fatald3derror类似的错误代码,这类问题的解...

Mac+双屏,前端程序员的专业配置 - Loctek 乐歌 D3D 双屏电脑显示器支架

做FE也有一段日子了,电脑屏幕每天在设计稿、浏览器、IDE、即时通讯工具、Terminal、邮箱之间切换。虽然mac的工作区带来了很多灵活,但是依然略显不足。于是入手支架,把公司配的电脑和显示器发挥起...

RPC 的原理和简单使用(rpc详解)

RPC的概念RPC,RemoteProcedureCall,翻译成中文就是远程过程调用,是一种进程间通信方式。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数。在调用的...

大厂开源的golang微服务rpc框架 — kitex

提前rpc估计所有的开发同学都知道,不知道的也无所谓,毕竟我也好几年没用了,今天带大家在复习一下。RPC(RemoteProcedureCall):远程过程调用,...

干货!一文掌握Protobuf所有语言所有用法,快收藏

说实话,Protobuf这个库,让人相见时难别亦难,东风无力百花残,每次等到要用它的时候,总感觉还没有完全掌握它的用法,而实际上等去百度或者谷歌的时候,教程都是多么的凌乱不堪。学会它,最直接关系到的,...

取消回复欢迎 发表评论: