无需安装Python,就可以在。net里调用Python库

  

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

  

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

  

  

     无需安装Python,就可以在。net里调用Python库”>
  <p>
  </p>
  
  <p>
  <br/>
  </p>
  <p>
  开发人员从Numpy。净的强类型API中获益,与动态API不同,后者支持Visual Studio的智能感知功能,可以显示原始的Numpy文档。
  </p>
  <h2类=         

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

  

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

           

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

           

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

  

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

  <前>   var  a =, np.array (new  [,], {{1,, 2}, {3,, 4}});。   之前   

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

  <前>   var  installer =, new  Python.Included.Installer ();   installer.SetupPython(武力:false) .Wait ();   之前   

  下一步(如果在之前的运行中还没完成)它将解压缩numpy pip轮,而numpy pip轮是作为嵌入的资源打包到了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函数本身的执行时间是完全相同的。   

无需安装Python,就可以在。net里调用Python库