思路
首先使用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运行环境能够找到相应的类库。
测试结果: