【问题标题】:.NET and Python interop via IronPython.NET 和 Python 通过 IronPython 互操作
【发布时间】:2018-10-10 00:05:13
【问题描述】:

我正在尝试使我的一些 Python 脚本可以从 .NET 中调用。我发现 IronPython 是完成此任务的好工具。所以我尝试使用它,但现在我有以下问题:

  1. 如何将软件包安装到 IronPython?我现有的 Python 代码使用它们,所以我需要安装它们。我尝试关注this guide 安装pip,但得到Process is terminated due to StackOverflowException. 并没有找到解决问题的方法。
  2. 假设我能够安装软件包,是否仍然不能在 IronPython 中使用具有 C/C++ 绑定的软件包?因为the FAQ page上写着不能安装NumPy和SciPy,但是页面好像比较老了。
  3. 如何从其他 .NET 代码访问 Python 代码? The documentation page 说我必须使用 DLR Hosting API,因为从 IronPython 编译的程序集不符合 CLS。但我不知道如何使它与包一起使用。
  4. 也许还有另一种方法可以从 .NET 调用 Python 代码?

提前致谢。

【问题讨论】:

  • @denfromufa 感谢您提供可能的解决方案。正如我所见,适用于 .NET 的 Python 需要完整的 CPython 安装。有没有办法将解释器和安装的包都“打包”(不知道如何正确调用这个过程)到一个“文件”中,并在 Python 中为.NET 使用这个“文件”作为解释器?我希望我的想法是可以理解的。
  • 是的,您需要使用 pythonhome 和路径 env 指向独立 CPython 解释器的位置。从 .NET 调用时的 vars

标签: python .net interop ironpython


【解决方案1】:

好的,我想我已经弄清楚了。

  1. pip 的问题是因为我尝试使用 ipy64。使用 ipy 解决了这个问题。
  2. 是的,现在不可能使用带有 C/C++ 绑定的包。
  3. 假设 pip 和 requests 是使用 ipy -X:Frames -m ensurepipipy -X:Frames -m pip install requests 安装的(有关 IronPython 中 pip 的更多信息可以在 here 找到)。可以通过以下方式使用 DLR 托管 API 来使用请求:

    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)中的 Hosting IronPython 部分中找到。

  4. As denfromufa has suggested 可以使用 Python for .NET 从 .NET 调用 CPython 代码。

【讨论】:

    猜你喜欢
    • 2011-02-25
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 2016-12-16
    • 2012-06-15
    相关资源
    最近更新 更多