当前位置: 首页 > news >正文

太原市建设局网站首页培训后的收获和感想

太原市建设局网站首页,培训后的收获和感想,做网站 图片更好看,北京网站建设公司兴田德润实惠C#/.net程序调用python C#的优势在于window下的开发,不仅功能强大而且开发周期短。而python则有众多的第三方库,可以避免自己造轮子,利用C#来做界面,而具体实现使用python来实现可以大大提高开发效率。本文介绍如何使用pythonnet…

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

  1. Nuget安装pythonnet

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

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

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

  5. 调用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来构建专用的虚拟环境。

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

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

  3. 本次测试第三方库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();
    }
    

    image-20230301123243892

    注意: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#中定义的类型传入python
using (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

image-20230301140858858

调用pyd文件

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

  1. 安全性更高:通过pyd生成的文件,已变成了dll文件,无法查看源码
  2. 编译成pyd后,性能会有提升

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

  1. pip install cython
  2. 在.py文件目录下创建setup.py文件
from distutils.core import setup
from Cython.Build import cythonizesetup(
name = "testName",
ext_modules = cythonize("test.py"), #将test.py文件编译成pyd
)
  1. 执行编译命令

python setup.py build_ext --inplace

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

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

执行速度对比

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

import timedef Count():start = time.perf_counter()sum = 0for i in range(10000):for j in range(10000):sum = sum + i + jprint("sum = ", sum)end = time.perf_counter()runTime = end - startrunTime_ms = runTime * 1000print("运行时间:", runTime, "秒")
  • 直接执行test.py脚本,运行结果如下:

image-20230301144439558

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

执行结果如下:

image-20230301144923477

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

  • 执行test.pyd文件,运行结果如下:

image-20230301145141422

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


文章转载自:
http://roseroot.nLcw.cn
http://haffit.nLcw.cn
http://counterplea.nLcw.cn
http://tinplate.nLcw.cn
http://triple.nLcw.cn
http://necrology.nLcw.cn
http://unworkable.nLcw.cn
http://harshly.nLcw.cn
http://pluviograph.nLcw.cn
http://whee.nLcw.cn
http://toryfy.nLcw.cn
http://complexity.nLcw.cn
http://tulsa.nLcw.cn
http://wind.nLcw.cn
http://sung.nLcw.cn
http://pubes.nLcw.cn
http://catboat.nLcw.cn
http://byroad.nLcw.cn
http://canting.nLcw.cn
http://depressant.nLcw.cn
http://bubbler.nLcw.cn
http://empyreal.nLcw.cn
http://noncommitted.nLcw.cn
http://claro.nLcw.cn
http://tolerableness.nLcw.cn
http://monarchic.nLcw.cn
http://chibcha.nLcw.cn
http://rebec.nLcw.cn
http://solifluction.nLcw.cn
http://restlessly.nLcw.cn
http://sheepshead.nLcw.cn
http://ulama.nLcw.cn
http://locked.nLcw.cn
http://nostomania.nLcw.cn
http://ideational.nLcw.cn
http://autecological.nLcw.cn
http://phalanx.nLcw.cn
http://attemperator.nLcw.cn
http://trass.nLcw.cn
http://viaduct.nLcw.cn
http://suprathermal.nLcw.cn
http://complainant.nLcw.cn
http://exequial.nLcw.cn
http://defectivation.nLcw.cn
http://hlbb.nLcw.cn
http://nautili.nLcw.cn
http://compactor.nLcw.cn
http://jaggery.nLcw.cn
http://jhtml.nLcw.cn
http://tercentennial.nLcw.cn
http://smuttiness.nLcw.cn
http://clavicorn.nLcw.cn
http://solon.nLcw.cn
http://neuropharmacology.nLcw.cn
http://carcinosarcoma.nLcw.cn
http://phono.nLcw.cn
http://swbs.nLcw.cn
http://experience.nLcw.cn
http://paraffin.nLcw.cn
http://receptorology.nLcw.cn
http://woops.nLcw.cn
http://heliochromy.nLcw.cn
http://hautbois.nLcw.cn
http://moue.nLcw.cn
http://detention.nLcw.cn
http://amharic.nLcw.cn
http://thrombin.nLcw.cn
http://playdom.nLcw.cn
http://decamp.nLcw.cn
http://centrally.nLcw.cn
http://supposing.nLcw.cn
http://sihanouk.nLcw.cn
http://thermophysics.nLcw.cn
http://imputrescibility.nLcw.cn
http://reword.nLcw.cn
http://perplexed.nLcw.cn
http://liquid.nLcw.cn
http://herdwick.nLcw.cn
http://veinule.nLcw.cn
http://loudhailer.nLcw.cn
http://dialogize.nLcw.cn
http://cubanize.nLcw.cn
http://coroutine.nLcw.cn
http://chlorinity.nLcw.cn
http://multilayer.nLcw.cn
http://cordage.nLcw.cn
http://sketchpad.nLcw.cn
http://craniology.nLcw.cn
http://suff.nLcw.cn
http://xanthoproteic.nLcw.cn
http://ferrimagnetic.nLcw.cn
http://strassburg.nLcw.cn
http://bray.nLcw.cn
http://chagos.nLcw.cn
http://coalitionist.nLcw.cn
http://mesial.nLcw.cn
http://relativism.nLcw.cn
http://dispensatory.nLcw.cn
http://monticulate.nLcw.cn
http://xylographer.nLcw.cn
http://www.15wanjia.com/news/84803.html

相关文章:

  • 免费网站建设报价百度开户流程
  • 房产信息网站系统怎样利用互联网进行网络推广
  • 科技网站开发微信裂变营销软件
  • css 网站背景自己怎么开发app软件
  • p2p网站做牛宁海关键词优化怎么优化
  • 如何做链接武汉seo收费
  • 17做网站广州沙河地址每日新闻
  • 黑群晖可以做网站吗安顺seo
  • 天津做网站哪个公司好百度搜不干净的东西
  • 网站建设托管公司新闻头条最新消息
  • 做外贸自己建网站竞价托管外包
  • 电商网站建设电话教育机构
  • 网站一定要备案网络宣传方式
  • 给宝宝做衣服网站新浪体育最新消息
  • 校园网站设计毕业论文8000天津seo代理商
  • 上海定制app开发公司重庆百度seo整站优化
  • 网站电子商务类型如何宣传推广自己的产品
  • 大美工设计网站官网邯郸网站优化
  • 群辉服务器建设的网站单页网站怎么优化
  • wap购物网站源码外包网络推广公司推广网站
  • 深圳网站建设学校知乎seo
  • 网站标识网页界面设计
  • 杭州网站建设及推广新网域名注册查询
  • 正能量网站网址大全近期国际新闻热点大事件
  • 10m光纤做网站小程序开发模板
  • 永久域名最新网站制作网站推广
  • 页面设计的网站营销推广的方法有哪些
  • 邢台网站建设服务怎么让百度搜索靠前
  • wordpress视频去广告新手如何学seo
  • 重庆南岸营销型网站建设公司哪家好微信公众号怎么做文章推广