返回顶部
首页 > 资讯 > 后端开发 > Python >怎么使用C#/.net程序调用Python
  • 957
分享到

怎么使用C#/.net程序调用Python

2023-07-05 08:07:10 957人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要介绍了怎么使用C#/.net程序调用python的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用C#/.net程序调用Python文章都会有所收获,下面我们一起来看看吧。C#/.net程序调用

这篇文章主要介绍了怎么使用C#/.net程序调用python的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用C#/.net程序调用Python文章都会有所收获,下面我们一起来看看吧。

C#/.net程序调用python

C#的优势在于window下的开发,不仅功能强大而且开发周期短。而python则有众多的第三方库,可以避免自己造轮子,利用C#来做界面,而具体实现使用python来实现可以大大提高开发效率。本文介绍如何使用pythonnet来执行python脚本,使用pythonnet既可以具有较高的交互性,又可以使用第三方python库,同时可以将程序需要的python环境及第三方库打包到软件中,避免用户进行python的环境配置。

C#调用python的常见方法

调用python常见的方法有4种

方式优点缺点
使用IronPython无需安装python运行环境,交互性强,C#和python无缝连接某些python第三方库不支持,如numpy
使用c++调用Python,然后将C++程序做成动态链接库交互性较强需要用户配置Python环境,实现方式复杂
利用C#命令行调用py文件执行速度快需要用户配置Python环境,交互性差
将python文件打包成exe进行调用无需安装python运行环境,执行速度慢,传递数据复杂,交互性差

可以看出4种方式均有限制,很难同时满足:交互性强、可调用第三方python库、无需用户配置Python环境要求,而这几项要求恰恰是一款成熟软件所必须的。而使用pythonnet库可满足以上三点要求。

本文均在.net 6环境下测试

使用pythonnet

  • Nuget安装pythonnet

  • 设置Runtime.PythonDLL属性,即pythonxx.dll路径,xx为版本号

  • 设置PythonEngine.PythonHome,即python.exe所在路径

  • 设置PythonEngine.PythonPath,python脚本所在目录,可以放置多个路径,以分号隔开,但是pathToVirtualEnv\Lib\site-packages和pathToVirtualEnv\Lib应放在最后

  • 调用PythonEngine.Initialize();

string pathToVirtualEnv = ".\\envs\\pythonnetTest";Runtime.PythonDLL = Path.Combine(pathToVirtualEnv, "python39.dll");PythonEngine.PythonHome = Path.Combine(pathToVirtualEnv, "python.exe");PythonEngine.PythonPath = $"{pathToVirtualEnv}\\Lib\\site-packages;{pathToVirtualEnv}\\Lib";PythonEngine.Initialize();//调用无参无返回值方法using (Py.GIL()) //执行python的调用应该放在using (Py.GIL())块内{    //python对象应声明为dynamic类型    dynamic np = Py.Import("test");    np.hello();}//调用有参有返回值方法using (Py.GIL()){    dynamic np = Py.Import("test");    int r = np.add(1, 2);    Console.WriteLine($"计算结果{r}");}

python文件,必须放在PythonEngine.PythonPath设定的目录下

def hello():    print("hello")def add(a,b):    return a+b

嵌入Python环境及使用第三方库

程序中包含Python脚本所需要的所有环境以及第三方库可以免去用户的自定义配置。本文使用Anaconda来构建专用的虚拟环境。

  • 创建专用虚拟环境(windows下首先切换到要建立虚拟环境的根目录下),执行conda create --prefix=F:\condaenv\env_name python=3.7路径及python版本根据需要自定义。

  • 使用Anaconda Prompt,激活虚拟环境conda activate F:\condaenv\env_name

  • 本次测试第三方库Numpy(如果需要其他库,安装方法相同),安装Numpypip install numpy

string pathToVirtualEnv = ".\\envs\\pythonnetTest";Runtime.PythonDLL = Path.Combine(pathToVirtualEnv, "python39.dll");PythonEngine.PythonHome = Path.Combine(pathToVirtualEnv, "python.exe");PythonEngine.PythonPath = $"{pathToVirtualEnv}\\Lib\\site-packages;{pathToVirtualEnv}\\Lib";PythonEngine.Initialize()//使用第三方库using (Py.GIL()){    dynamic np = Py.Import("numpy");    Console.WriteLine(np.cos(np.pi * 2));    dynamic sin = np.sin;    Console.WriteLine(sin(5));    double c = (double)(np.cos(5) + sin(5));    Console.WriteLine(c);    dynamic a = np.array(new List<float> { 1, 2, 3 });    Console.WriteLine(a.dtype);    dynamic b = np.array(new List<float> { 6, 5, 4 }, dtype: np.int32);    Console.WriteLine(b.dtype);    Console.WriteLine(a * b);    Console.ReadKey();}

怎么使用C#/.net程序调用Python

注意:C#和python对象进行数学运算时,必须将Python对象放到前面,例如np.pi*2,不能是2*np.pi

传递对象

可以将C#对象传递到python中

在C#中定义对象

public class Person{    public Person(string firstName, string lastName)    {        FirstName = firstName;        LastName = lastName;    }    public string FirstName { get; set; }    public string LastName { get; set; }}
string pathToVirtualEnv = ".\\envs\\pythonnetTest";Runtime.PythonDLL = Path.Combine(pathToVirtualEnv, "python39.dll");PythonEngine.PythonHome = Path.Combine(pathToVirtualEnv, "python.exe");PythonEngine.PythonPath = $"{pathToVirtualEnv}\\Lib\\site-packages;{pathToVirtualEnv}\\Lib";PythonEngine.Initialize();//将C#中定义的类型传入pythonusing (Py.GIL()) {    Person p = new Person("John", "Smith");PyObject pyPerson = p.ToPython();string r1 = test.FullName(pyPerson);Console.WriteLine($"全名:{r1}");}

python脚本

def FullName(p):    return p.FirstName+""+p.LastName

怎么使用C#/.net程序调用Python

调用pyd文件

pyd文件主要有以下2点作用:

  • 安全性更高:通过pyd生成的文件,已变成了dll文件,无法查看源码

  • 编译成pyd后,性能会有提升

将.py文件编译成pyd文件步骤如下:

pip install cython

在.py文件目录下创建setup.py文件

from distutils.core import setupfrom Cython.Build import cythonizesetup(name = "testName",ext_modules = cythonize("test.py"), #将test.py文件编译成pyd)

执行编译命令

python setup.py build_ext --inplace

最后生成的pyd文件一般是test+cpython版本-平台为文件名,可以重命名为test名称,也可以不管,使用时仍然可以按test调用。

调动pyd文件和调用py文件相同,但是执行效率大大增强,下文会对执行速度进行对比。

执行速度对比

在test.py中定义一个耗时函数

import timedef Count():    start = time.perf_counter()    sum = 0    for i in range(10000):        for j in range(10000):            sum = sum + i + j    print("sum = ", sum)    end = time.perf_counter()    runTime = end - start    runTime_ms = runTime * 1000    print("运行时间:", runTime, "秒")

直接执行test.py脚本

运行结果如下:

怎么使用C#/.net程序调用Python

在C#中调用Conut()函数

//运行时间测试Console.WriteLine("C#开始计时");Stopwatch stopWatch = new Stopwatch();stopWatch.Start();test.Count();stopWatch.Stop();Console.WriteLine($"C#计时结束{stopWatch.ElapsedMilliseconds}");

执行结果如下:

怎么使用C#/.net程序调用Python

可以看到,使用pythonnet调用python脚本会有一定的性能损失,不过在对性能要求不是十分高的条件下是可以接受的。

执行test.pyd文件

运行结果如下:

怎么使用C#/.net程序调用Python

从结果可以看出调用pyd比原生的py文件执行还要快,所以可以使用pythonnet来执行pyd文件,即实现代码保护又提升了执行效率。

关于“怎么使用C#/.net程序调用Python”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“怎么使用C#/.net程序调用Python”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网Python频道。

--结束END--

本文标题: 怎么使用C#/.net程序调用Python

本文链接: https://lsjlt.com/news/350542.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么使用C#/.net程序调用Python
    这篇文章主要介绍了怎么使用C#/.net程序调用Python的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用C#/.net程序调用Python文章都会有所收获,下面我们一起来看看吧。C#/.net程序调用...
    99+
    2023-07-05
  • C#/.net程序调用Python的教程分享
    目录C#调用python的常见方法使用pythonnet嵌入Python环境及使用第三方库传递对象调用pyd文件执行速度对比C#/.net程序调用python C#的优势在于wind...
    99+
    2023-03-02
    C#调用Python方法 C#调用Python C# Python
  • ​C#怎么使用WinExec调用exe程序
    在C#中,可以使用Process.Start方法来调用外部的可执行程序。例如,要调用一个名为test.exe的可执行文件,可以使用以...
    99+
    2023-10-23
    ​C#
  • C语言程序怎么调用Python函数
    本篇文章为大家展示了C语言程序怎么调用Python函数,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python脚本,存为pytest.pydef add(a,b):  ...
    99+
    2023-06-17
  • Python中怎么调用.net framework
    今天就跟大家聊聊有关Python中怎么调用.net framework,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 安装python2.5和对应的pywin32 下载ironPyt...
    99+
    2023-06-17
  • 在Linux中怎么使用gdb调试C程序
    这篇文章主要为大家展示了“在Linux中怎么使用gdb调试C程序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“在Linux中怎么使用gdb调试C程序”这篇文章吧。无论多么有经验的程序员,开发的任...
    99+
    2023-06-16
  • c语言主程序怎么调用子程序
    在C语言中,主程序可以通过函数调用的方式来调用子程序。以下是一个简单的示例:```c#include // 声明子程序void su...
    99+
    2023-10-12
    c语言
  • C#调用记事本程序怎么应用
    本篇内容介绍了“C#调用记事本程序怎么应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C#调用记事本程序编辑文本文件的实现其实在整个程序中...
    99+
    2023-06-17
  • 怎么使用Flex调试程序
    这篇文章主要为大家展示了“怎么使用Flex调试程序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么使用Flex调试程序”这篇文章吧。使用Flex调试程序如果Flex程序编译时报错,需要修改程序...
    99+
    2023-06-17
  • python使用IPython调试debug程序
    目录安装使用方法优点提示和不足参考链接关于IPython使用的入门文章,主要介绍了如何在程序代码中嵌入ipython用于调试,并分析了优点与不足。 在 Python 中编程时,我会花...
    99+
    2024-04-02
  • Python调用C++程序的方法详解
    前言 大家都知道Python的优点是开发效率高,使用方便,C++则是运行效率高,这两者可以相辅相成,不管是在Python项目中嵌入C++代码,或是在C++项目中用Python实现外围功能,都可能遇到Pyth...
    99+
    2022-06-04
    详解 程序 方法
  • C++如何调用简单的python程序
    目录一、基本环境的搭建二、直接在C++里面调用执行python语句三、调用python脚本文件里面的定义函数调用不含参数的函数调用含多个参数的函数总结一、基本环境的搭建 首先,用vs...
    99+
    2023-02-17
    C++调用python程序 C++调用python C++调用python
  • C#怎么开发Winform程序调用存储
    这篇文章主要讲解了“C#怎么开发Winform程序调用存储”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么开发Winform程序调用存储”吧!数据表及数据准备:create ...
    99+
    2023-06-30
  • php调用python程序
    php调用python程序 1.使用exec()函数 2.使用shell_exec()函数 3.使用Python扩展 要在PHP中调用Python程序,您可以使用以下方法之一: ...
    99+
    2023-09-07
    php 开发语言
  • Java如何调用C++程序
    这篇文章将为大家详细讲解有关Java如何调用C++程序,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、编写Java程序:HelloWorld代码如下:package HelloWorld;pu...
    99+
    2023-06-29
  • linux中怎么使用gdb调试程序
    在Linux中使用gdb调试程序,可以按照以下步骤进行操作:1. 在命令行中编译你的程序时,加上`-g`选项,以便生成调试信息。例如...
    99+
    2023-09-13
    linux
  • 怎么使用eclipse进行程序调试
    使用Eclipse进行程序调试的步骤如下:1. 在Eclipse中打开要调试的Java项目,并确保项目已经编译成功。2. 在代码中设...
    99+
    2023-09-13
    eclipse
  • C#中怎么使用IronPython库调用Python脚本
    在C#中使用IronPython库调用Python脚本的步骤如下: 首先,需要将IronPython库添加到C#项目中。可以通过...
    99+
    2024-03-08
    python C#
  • .net任务调度框架FluentScheduler怎么使用
    这篇文章主要介绍“.net任务调度框架FluentScheduler怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“.net任务调度框架FluentScheduler怎么使用”文章能帮助大家解...
    99+
    2023-07-02
  • .net任务调度框架Hangfire怎么使用
    这篇文章主要讲解了“.net任务调度框架Hangfire怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“.net任务调度框架Hangfire怎么使用”吧!简单使用:这里就简单的演示.n...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作