前言
InronPython是一種在.NET和Mono上實作的Python語言,使用InronPython就可以在.NET環境中調用Python代碼,非常友善。
本文主要介紹在C#中調用Python代碼,并使用Python安裝的第三方子產品。
安裝InronPython
要在.NET環境中使用Python,先要安裝InronPython(當然也要安裝Python),安裝很簡單,直接下載下傳安裝就行。在CodePlex就有下載下傳,下載下傳位址:
使用
添加引用庫
在Visual Studio建立一個工程後,添加引用IronPython.dll和Microsoft.Scripting.dll(位于InronPython的安裝目錄下,如下圖)。

C#代碼内嵌Python
最簡單的使用方式如下:var engine = IronPython.Hosting.Python.CreateEngine();
engine.CreateScriptSourceFromString("print 'hello world!'").Execute();
從檔案中加載Python代碼
一般情況下我們還是要把Python代碼單獨寫在檔案中。在工程中建立一個Python檔案,如 hello.py ,并設定其屬性Copy to Output Directory的值為Copy if newer。在hello.py下編寫如下代碼:def say_hello():
print "hello!"
def get_text():
return "text from hello.py"
def add(arg1, arg2):
return arg1 + arg2
C#代碼如下:var engine = IronPython.Hosting.Python.CreateEngine();
var scope = engine.CreateScope();
var source = engine.CreateScriptSourceFromFile("hello.py");
source.Execute(scope);
var say_hello = scope.GetVariable>("say_hello");
say_hello();
var get_text = scope.GetVariable>("get_text");
var text = get_text().ToString();
Console.WriteLine(text);
var add = scope.GetVariable>("add");
var result1 = add(1, 2);
Console.WriteLine(result1);
var result2 = add("hello ", "world");
Console.WriteLine(result2);
更詳細的使用方法可參考 文檔 和 代碼例子 。
使用Python安裝的第三子產品
問題
到此為止,程式運作得很順利。可是好景不長,最近用Python寫了個程式要使用rsa加密,在Python中安裝了rsa子產品(下載下傳位址: https://pypi.python.org/pypi/rsa/3.1.1 )後,直接運作Python代碼沒問題,可是在C#代碼調用時就報異常,異常資訊如下:An unhandled exception of type 'IronPython.Runtime.Exceptions.ImportException' occurred in Microsoft.Dynamic.dll
Additional information: No module named rsa
沒有找到子產品,經過一番google,說是要設定 sys.path ,如下:import sys
sys.path.append(r"c:\python27\lib")
照做之後問題依舊。不過想一想,應該是sys.path還沒設定對。
解決
先在python代碼加上下面幾行:import sys
sys.path.append(r"c:\python27\lib")
print sys.path
運作檢視輸出,在對比Python環境下的 sys.path ,果然不一樣,問題應該就出在 sys.path 上了。
在cmd下分别打開python和IronPython(在IronPython安裝目錄下的ipy64.exe或ipy.exe),執行 import sys;print sys.path ,對比輸出:
python:['', 'C:\\Python27\\lib\\site-packages\\setuptools-12.0.3-py2.7.egg', 'C:\\Pytho
n27\\lib\\site-packages\\rsa-3.1.1-py2.7.egg', 'C:\\Python27\\lib\\site-packages
\\pyasn1-0.1.7-py2.7.egg', 'C:\\Windows\\SYSTEM32\\python27.zip', 'C:\\Python27\
\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\
lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages']
IronPython:['.', 'C:\\Program Files (x86)\\IronPython 2.7\\Lib', 'C:\\Program Files (x86)\\
IronPython 2.7\\DLLs', 'C:\\Program Files (x86)\\IronPython 2.7', 'C:\\Program F
iles (x86)\\IronPython 2.7\\lib\\site-packages']
分别在兩個環境在執行 import rsa ,Python環境正常,IronPython環境下報ImportError: No module named rsa異常。在IronPython環境下執行如下操作:sys.path.append('C:\\Python27\\lib\\site-packages\\setuptools-12.0.3-py2.7.egg')
sys.path.append('C:\\Python27\\lib\\site-packages\\rsa-3.1.1-py2.7.egg')
再次 import rsa ,不報異常了。
對應的python代碼檔案加上如下幾行:import sys
sys.path.append('C:\\Python27\\lib')
sys.path.append('C:\\Python27\\lib\\site-packages\\setuptools-12.0.3-py2.7.egg')
sys.path.append('C:\\Python27\\lib\\site-packages\\rsa-3.1.1-py2.7.egg')
import rsa
再次運作,Ok!