python代码封装二进制文件并使用C#调用方案

4 篇文章 0 订阅

思路

首先使用Cython库将python代码生成二进制文件pyd,然后使用C#中的pythonnet的Nuget包来进行调用,python代码中可以使用第三方类库

Cython使用

Cython的安装

在命令行中使用如下语句即可安装Cython

pip install cython

pyd文件格式

Cython用于编写Python扩展模块,并且拥有较高的执行性能。Cython将源代码转译成C或C++语法后,自动包装上函数调用生成.pyd(或 .so ,因操作系统而异)后缀的二进制文件,该文件可当成普通的Python类库。

如果有pyd文件testCopy.pyd用于测试,在其中使用OpenCV库进行简单的图像读取和写出(OpenCV库不重要,意为可以使用第三方类库),在源码中可以使用如下代码来引入testCopy.pyd中包含的testCopy:

import testCopy

要使用test中的函数add(i,j),可以如下方式进行:

testCopy.add(5,7)

Cython库的使用

在包含源代码的目录下创建setup.py,用于根据源码生成pyd文件,setup.py的代码内容如下:

from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules= cythonize("testCopy.py") # test.py为要转化为pyd文件的源代码
)

使用如下命令运行setup.py代码来生成pyd文件

python setup.py build_ext --inplace

如果生成成功,会产生如下图所示的结果
请添加图片描述

假设testCopy.py中写了一个简单的函数copyImage,这里引入了OpenCV库,因此该代码具有普遍性可以引入第三方类库

import cv2

def copyImage(inputPath, outputPath):
    img=cv2.imread(inputPath, cv2.IMREAD_COLOR)
    cv2.imwrite(outputPath, img)
    print("已经复制图片") # 增加输出来显示结果

测试pyd文件

可以使用python引入testCopy类库来进行测试

import testCopy

testCopy.copyImage("img.jpg","output.jpg")

执行得到如下结果:
请添加图片描述

图片已经被成功复制

C#调用pyd文件

安装pythonnet包

Nuget包管理页面搜索pythonnet包,安装即可。
请添加图片描述
创建C#命令行项目,输入如下代码:

using Python.Runtime;

//初始化python环境
Runtime.PythonDLL = @"E:\Programs\python39\python39.dll";
PythonEngine.Initialize();
PythonEngine.PythonPath = @"E:\Programs\python39;E:\Programs\python39\Lib;E:\Programs\python39\Lib\site-packages";

dynamic test = Py.Import("testCopy");
test.copyImage("img.jpg", "output2.jpg");

PythonEngine.Shutdown();

要使得pyd能够使用第三方的类库,重点是需要配置PythonEngine.PythonPath选项,需要设置将该选项设置为 python安装位置、python安装位置\LIB 和 python安装目录\Lib\site-packages,来保证python运行环境能够找到相应的类库

测试结果:
请添加图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YoseZang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值