通过IronPython实现.NET和Python interop

问题描述:

我试图让我的一些Python脚本可以从.NET调用。我发现IronPython是一个很好的工具来完成这个任务。所以我试图使用它,但现在我有以下问题:通过IronPython实现.NET和Python interop

  1. 如何将软件包安装到IronPython?我现有的Python代码使用它们,所以我需要安装它们。我试图按照this guide来安装点子,但得到了Process is terminated due to *Exception.,并没有找到解决问题的方法。
  2. 假设我可以安装软件包,在IronPython中是否仍然有包含C/C++绑定的软件包?因为在the FAQ page被写为NumPy和SciPy无法安装,但该网页似乎是相当老。
  3. 从其他.NET代码访问Python代码怎么样? The documentation page表示我必须使用DLR Hosting API,因为从IronPython编译的程序集不符合CLS。但我不知道如何使它与包一起工作。
  4. 也许有另一种方法从.NET调用Python代码?

在此先感谢。

+1

http://www.python4.net – denfromufa

+0

@denfromufa感谢您提供可能的解决方案。正如我看到Python for Python需要完整的CPython安装。有没有办法将解释器和安装的软件包“打包”(不知道如何调用这个过程),并将其用于.NET中的解释器?我希望我的想法是可以理解的。 – DfM

+1

是的,你需要指向使用pythonhome和path env的独立CPython解释器的位置。从.NET调用时发生变化 – denfromufa

好吧,我想我已经弄明白了。

  1. pip的问题是由于我尝试使用ipy64的事实。使用ipy解决了这个问题。
  2. 是的,今天不可能在C/C++绑定中使用包。
  3. 让我们假设使用ipy -X:Frames -m ensurepipipy -X:Frames -m pip install requests安装pip和请求(有关IronPython中pip的更多信息,请参见here)。

    var engine = IronPython.Hosting.Python.CreateEngine(new Dictionary<string, object> {{"Frames", true}}); 
    var searchPaths = engine.GetSearchPaths(); 
    searchPaths.Add(@"C:\Program Files (x86)\IronPython 2.7\Lib"); 
    searchPaths.Add(@"C:\Program Files (x86)\IronPython 2.7\Lib\site-packages"); 
    engine.SetSearchPaths(searchPaths); 
    engine.CreateScriptSourceFromString("import requests; r = requests.get('http://www.google.com/'); print r.status_code").Execute(); 
    

    对主办Python可以在IronPython的文档文件(默认位置是C:\Program Files (x86)\IronPython 2.7\Doc\IronPython.chm)发现在托管IronPython的部分更多信息:请求可以使用DLR以下列方式托管API来使用。

  4. 由于denfromufa建议可以使用Python for .NET从.NET调用CPython代码。