2017-06-02 46 views
2

我試圖讓我的一些Python腳本可以從.NET調用。我發現IronPython是一個很好的工具來完成這個任務。所以我試圖使用它,但現在我有以下問題:通過IronPython實現.NET和Python interop

  1. 如何將軟件包安裝到IronPython?我現有的Python代碼使用它們,所以我需要安裝它們。我試圖按照this guide來安裝點子,但得到了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代碼?

在此先感謝。

+1

http://www.python4.net – denfromufa

+0

@denfromufa感謝您提供可能的解決方案。正如我看到Python for Python需要完整的CPython安裝。有沒有辦法將解釋器和安裝的軟件包「打包」(不知道如何調用這個過程),並將其用於.NET中的解釋器?我希望我的想法是可以理解的。 – DfM

+1

是的,你需要指向使用pythonhome和path env的獨立CPython解釋器的位置。從.NET調用時發生變化 – denfromufa

回答

2

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

  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代碼。