作者 |  Meinrad Recheis

译文来源  |  草根专栏(ID:Cgzl-Tech)

Pythonnet这个屌爆的项目的出现,使得我们可以用一种新的方式,让C#可以和Python之间进行互操作。但是它的设置和部署可能有点问题,真的是这样吗?

本文我会介绍Python.Included这个项目,它不但优雅的解决了这个问题,并且让.NET开发者可以轻松愉快的让.NET与Python进行互操作。作为概念的证明,我将使用Numpy.Net进行展示,它是一个.NET标准库,它为Python的Numpy提供了一个强类型API,并且使用它并不需要在Windows上安装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机器学习社区成长和繁荣。

原文地址:

https://henon.wordpress.com/2019/06/05/using-python-libraries-in-net-without-a-python-installation/

(*本文仅代表作者观点,转载请联系原作者)

在线公开课

推荐阅读:

  • 从0到1:Web开发绕不开的WSGI到底是什么?

  • 24式,加速你的Python

  • 安卓运行Jupyter Notebook操作指南,不用电脑也能做数据分析!

  • 毕业10年后,我忍不住出了一份程序员的高考试卷!

  • Python从入门到精通,这篇文章为你列出了25个关键技术点(附代码)

  • 500行Python代码打造刷脸考勤系统

你点的每个“在看”,我都认真当成了喜欢

.net安装_无需安装Python,就可以在.NET里调用Python库相关推荐

  1. 【翻译】无需安装Python,就可以在.NET里调用Python库

    原文地址:https://henon.wordpress.com/2019/06/05/using-python-libraries-in-net-without-a-python-installat ...

  2. 无需安装Python,就可以在.NET里调用Python库

    作者 |  Meinrad Recheis 译文来源  |草根专栏(ID:Cgzl-Tech) Pythonnet这个屌爆的项目的出现,使得我们可以用一种新的方式,让C#可以和Python之间进行互操 ...

  3. c调用python函数_python - Linux C调用Python 函数

    1.Python脚本,名称为py_add.py def add(a=,b=): print('Function of python called!') print('a = ',a) print('b ...

  4. net能和python结合吗_如何不用安装python就能在.NET里调用Python库

    前言 Pythonnet这个屌爆的项目的出现,使得我们可以用一种新的方式,让C#可以和Python之间进行互操作.但是它的设置和部署可能有点问题,真的是这样吗? 本文我会介绍Python.Includ ...

  5. python图形化方式模块安装_(怎么安装python模块,如何安装python模块,常用安装方式)python助手安装教程视频...

    有没有比较好的python3的入门视频教程,网盘或网站都可以. 我这里有Python,开发,进阶,自动化,实战列视频教程,还有安装包,,代码等容,这里就不一一说了,全套内容一共300G左右,非常的详细 ...

  6. python3编译安装_编译安装Python 3

    目前Python最新版为Python 3,以下是编译安装Python 3.7.0的方法,根据提示一行一个命令输入即可: #安装依赖 yum -y install wget gcc gcc-c++ li ...

  7. python keras安装_环境安装 安装TensorFlow与Keras

    安装TensorFlow与Keras 在TensorFlow官网介绍了很多安装TensorFlow的方式. 这里只介绍最简单的安装方式,就是以Anaconda安装.安装TensorFlow必须安装Py ...

  8. python识别文字免安装_免安装方式的Python之VSCode环境配置

    概述 本文旨在介绍免安装方式,在VSCode中搭建Python(3.73)的配置环境.至于Python是什么.它能做些什么,诸如此类的介绍均不在此文中介绍,相信能看此文的人,多多少少都会有些了解. V ...

  9. python 编译器spyder 安装_离线安装spyder的Python环境

    一.介绍:要求在不联网.无法使用anaconda的情况下,在一台离线的win7设备上配置Spyder的python的开发环境,用于提高数据处理效率,且安装方法在win7 32位和64位的各种设备上均可 ...

最新文章

  1. expert one on one oracle,数据库表——EXPERT ONE-ON-ONE ORACLE
  2. Python 这么火,如何快速掌握?
  3. 【机器学习】scikit-learn 1.0 版本重要新特性一览
  4. 数据结构(python语言)目录链接
  5. html css3模拟心的跳动
  6. Android view转bitmap,byte[]转Bitmap
  7. python中交换a和b的值_交换A和B之间的元素以获得和相等
  8. 浙大 PAT 乙级1055
  9. c语言字符括号怎么表示什么意思,请问C语言中的bioskey(0)是啥意思,括号里的值又有啥用?...
  10. HTTP协议 通信过程介绍
  11. WEB数据挖掘(十)——Aperture数据抽取(6):在Aperture中使用RDF2Go
  12. 售假获刑后他又被淘宝告上法庭,杭州互联网法院当庭宣判
  13. 【SQL注入-01】SQL语句基础及SQL注入漏洞原理及分类
  14. deepin安装NVIDIA显卡驱动
  15. oracle中字符串长度计算,根据 oracle 标准计算超长字符串的长度
  16. 共享经济开始崩溃,区块链能否再续共享经济神话?
  17. 读《纳瓦尔宝典》感想
  18. C#应用程序与MATLAB联合编程
  19. AJAX与cooikes
  20. 劫持流量原理是什么?关于劫持流量的种类和产生

热门文章

  1. 计算机视觉的数据增广技术大盘点!附涨点神器,已开源!
  2. 腾讯优图10篇AAAI论文解析,涉及数学速算批改、视频识别和语义分割 | 附下载...
  3. 轻量级卷积神经网络的设计技巧
  4. Nacos源码系列——第三章(全网最经典的Nacos集群源码主线剖析)
  5. beautifulsoup关于标签的初学习
  6. 记事本里出现该文件含有Unicode格式的字符,当保存为ANSI编码的文本时,该字符将丢失。怎么解决?
  7. Windows禁止启动某个程序!偷偷禁止,别人就打不开。。。比如,微信 LOL 吃鸡 爱奇艺
  8. Python 的 __name__ 变量,到底是个什么东西?
  9. SSHFD:IBM提出的单阶段人体跌倒检测网络
  10. Spring Boot(一)