如何不用安装python就能在.NET里调用Python库


Posted in Python onJuly 12, 2019

前言

Pythonnet这个?疟?南钅康某鱿郑?沟梦颐强梢杂靡恢中碌姆绞剑??#可以和Python之间进行互操作。但是它的设置和部署可能有点问题,真的是这样吗?

本文我会介绍Python.Included这个项目,它不但优雅的解决了这个问题,并且让.NET开发者可以轻松愉快的让.NET与Python进行互操作。作为概念的证明,我将使用Numpy.Net进行展示,它是一个.NET标准库,它为Python的Numpy提供了一个强类型API,并且使用它并不需要在Windows上安装Python。

如何不用安装python就能在.NET里调用Python库

开发人员从Numpy.NET的强类型API中获益,与动态API不同,后者支持Visual Studio的IntelliSense功能,可以显示原始的Numpy文档。

问题是什么?

每个人可能都安装了不同版本的Python,有一些人用Python 2.7,其他一些人用Python 3.5,3.6甚至3.7。当你使用pythonnet的时候,针对Python的每个小版本,它必须使用不同的配置进行编译,而且该版本的Python必须安装,这样代码才可以运行。所以如果你在团队里工作,每个人就必须配置完全相同的Python环境。但拿我们的SciSharp团队来说,情况就已经不是这样的了。如果你想部署你的.NET应用,你首先必须部署Python,从开发人员角度来讲,这很闹心。

然而,如果你正在搞机器学习和人工智能,尽管微软和SciSharp都付出了很大努力,但目前你还是无法完全避免Python的使用。如果你看一下正在使用pythonnet的项目的列表,你会发现很多AI领域的公司当前都在使用.NET与Python进行连接。

Python.Included 前来救援

如果你可以很简单的引用一个Nuget包,并在无需手动修改的情况下,一切都会自动的配置好,假如可以达到这种程度,你会感觉怎么样?这就是我创建Python.Included的愿景,Python.Included可以把packages python-3.7.3-embed-amd64.zip包含在它的程序集里,这这样就允许你可以通过Nuget来有效的引用Python了。为了证明它能正常工作,并可以快速提供所有的NumSharp中仍然缺少的Numpy功能,我创建了基于Python.Included的Numpy.NET这个项目。

概念验证:Numpy.NET

Numpy.NET为Numpy提供了强类型的包装函数,这意味着您完全不需要使用dynamic关键字,但这部分我会在另一篇文章中深入讨论。今天的重点是介绍 Numpy.NET 如何使用 Python.Included 来按需自动部署Python和Numpy以便对它们进行调用。

这是Numpy将在幕后实际执行的设置代码。这些都不需要你来操作。一旦你使用了它的一个函数:

var a = np.array(new [,] {{1, 2}, {3, 4}});,

Numpy.dll 就会设置好嵌入的Python发行版,而它是从你本机home目录里的程序集里解压缩出来的(如果还没安装过的话)。

var installer = new Python.Included.Installer();
installer.SetupPython(force:false).Wait();

下一步(如果在之前的运行中还没完成)它将解压缩 numpy pip wheel,而numpy pip wheel 是作为嵌入的资源打包到了Numpy.dll里的并其安装到了Python安装文件里。

installer.InstallWheel(typeof(NumPy).Assembly, "numpy-1.16.3-cp37-cp37m-win_amd64.whl").Wait();

最后,pythonnet运行时被初始化了,Numpy也被导入进来了,可供后续使用。

PythonEngine.Initialize();
Py.Import("numpy");

这些都是在幕后发生的,使用Numpy.dll的用户根本不用担心本地的Python安装。事实上,即使您已安装了任何版本的Python也无所谓。

性能注意事项

大家都知道pythonnet比较慢,因此您可能会问自己,使用pythonnet将Python库与.NET接在一起是否真的是一个好主意。一如既往,这要看情况而定。

我的测试结果表明,与直接从Python调用Numpy相比,使用.net调用numpy的开销大约是它的4倍。需要澄清一下,这并不意味着Numpy.NET比python中的numpy慢四倍,这仅仅意味着通过pythonnet调用Numpy会有额外的开销。当然了,由于Numpy.NET调用的是Numpy,Numpy函数本身的执行时间是完全相同的。

开销是否是一个问题完全取决于实际用例。如果您在一个嵌套循环中不断的在CLR和Python之间来回切换,那就可能会遇到问题。但大多数Python库的设计都都是为了提高效率,避免数据循环。Numpy允许您只使用一个调用就可以对数百万的数组元素进行操作。Pytorch和Tensorflow允许您完全在GPU上执行操作。因此,如果正确使用,与处理大量数据时操作的执行时间相比,互操作开销可以忽略不计。

路线图

我知道现在有很多把Numpy移植到.NET上的方案和项目,例如使用IronPython。但是IronPython项目仍然只支持Python 2.7,而且项目进展非常缓慢。这就导致了依赖于python 3的库不能通过IronPython来获得和使用,而且这种情况在近期也不会有什么改变。

我的重点是通过pythonnet为.NET提供更多的机器学习和人工智能库。SciSharp团队也在讨论如何研发出一个更快版本的pythonnet,从而避免使用天性缓慢的DynamicObject。

请尝试一下Numpy.NET,并让我知道它为你做了什么并且做的如何。如果有任何意见或建议,我将不胜感激,我希望我的工作能够帮助.NET机器学习社区成长和繁荣。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中处理字符串之endswith()方法的使用简介
May 18 Python
Python中文分词实现方法(安装pymmseg)
Jun 14 Python
Python2.X/Python3.X中urllib库区别讲解
Dec 19 Python
python3实现跳一跳点击跳跃
Jan 08 Python
一篇文章读懂Python赋值与拷贝
Apr 19 Python
django框架forms组件用法实例详解
Dec 10 Python
Windows下实现将Pascal VOC转化为TFRecords
Feb 17 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
Mar 11 Python
Python matplotlib画图时图例说明(legend)放到图像外侧详解
May 16 Python
python中有函数重载吗
May 28 Python
Python 程序员必须掌握的日志记录
Aug 17 Python
如何基于matlab相机标定导出xml文件
Nov 02 Python
python 执行终端/控制台命令的例子
Jul 12 #Python
python IDLE 背景以及字体大小的修改方法
Jul 12 #Python
Python-Tkinter Text输入内容在界面显示的实例
Jul 12 #Python
Python爬虫抓取技术的一些经验
Jul 12 #Python
python 使用装饰器并记录log的示例代码
Jul 12 #Python
如何使用python爬虫爬取要登陆的网站
Jul 12 #Python
Pycharm使用之设置代码字体大小和颜色主题的教程
Jul 12 #Python
You might like
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
2014/06/23 PHP
Php连接及读取和写入mysql数据库的常用代码
2014/08/11 PHP
yii2中的rules 自定义验证规则详解
2016/04/19 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
2016/07/13 PHP
浅说js变量
2011/05/25 Javascript
js解析与序列化json数据(一)json.stringify()的基本用法
2013/02/01 Javascript
jQuery遍历Form示例代码
2013/09/03 Javascript
angularjs 处理多个异步请求方法汇总
2015/01/06 Javascript
jquery插件qrcode在线生成二维码
2015/04/26 Javascript
js面向对象实现canvas制作彩虹球喷枪效果
2016/09/24 Javascript
JS实现页面跳转参数不丢失的方法
2016/11/28 Javascript
原生javascript实现分页效果
2017/04/21 Javascript
parabola.js抛物线与加入购物车效果的示例代码
2017/10/25 Javascript
Vue实现底部侧边工具栏的实例代码
2018/09/03 Javascript
vscode下的vue文件格式化问题
2018/11/28 Javascript
微信端调取相册和摄像头功能,实现图片上传,并上传到服务器
2019/05/16 Javascript
原生js实现二级联动菜单
2019/11/27 Javascript
修改Vue打包后的默认文件名操作
2020/08/12 Javascript
[01:18:21]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频4K
2018/12/05 DOTA
用Python计算三角函数之atan()方法的使用
2015/05/15 Python
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
Python通过OpenCV的findContours获取轮廓并切割实例
2018/01/05 Python
pandas object格式转float64格式的方法
2018/04/10 Python
Python 数据处理库 pandas 入门教程基本操作
2018/04/19 Python
Django框架model模型对象验证实现方法分析
2019/10/02 Python
python解释器pycharm安装及环境变量配置教程图文详解
2020/02/26 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
2020/03/01 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
2020/03/10 Python
荷兰男士时尚网上商店:Suitable
2017/12/25 全球购物
人力资源主管职责范本
2014/03/05 职场文书
《分一分》教学反思
2014/04/13 职场文书
房地产端午节活动方案
2014/08/24 职场文书
刑事辩护授权委托书格式
2014/10/13 职场文书
2016年春节慰问信息
2015/03/25 职场文书
蜗居观后感
2015/06/11 职场文书