天天看點

c調用python第三方包大包_C#調用Python腳本并使用Python的第三方子產品

前言

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第三方包大包_C#調用Python腳本并使用Python的第三方子產品

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!