【轉載】
前言
InronPython是一種在.NET和Mono上實現的Python語言,使用InronPython就可以在.NET環境中調用Python代碼,非常方便。
本文主要介紹在C#中調用Python代碼,。
安裝InronPython
要在.NET環境中使用Python,先要安裝InronPython(當然也要安裝Python),安裝很簡單,直接下載安裝就行。在CodePlex就有下載,下載地址:
#region 方法一 // Console.WriteLine("Hello World0.0!"); var pythonEngine = Python.CreateEngine();//(options);//創建pyhon引擎 var Index = Directory.GetCurrentDirectory().LastIndexOf("bin"); //var strpath = Directory.GetCurrentDirectory().Remove(Index) + @"Sum\trys20190227.py"; var strpath = Directory.GetCurrentDirectory().Remove(Index) + @"try_Create\try20190227.py"; var pyText = Convert.ToBase64String(File.ReadAllBytes(new FileInfo(strpath).ToString())); var CodeString = Encoding.UTF8.GetString(Convert.FromBase64String(pyText)); //讀取文件 方法一` //var script = pythonEngine.CreateScriptSourceFromString(CodeString); //讀取文件 方法二` 同樣適用 var script = pythonEngine.CreateScriptSourceFromFile(strpath); var code = script.Compile(); //編譯 var scope = pythonEngine.CreateScope(); var excuteResult = code.Execute(scope); //調用py方法,不帶參數 //var _func = scope.GetVariable("TestString"); //var CustomerData = _func(); //調用py方法,帶參數 var _func = scope.GetVariable("str_add"); //var CustomerData = _func("2","3"); Console.WriteLine(_func()); Console.ReadKey(); #endregion #region 方法二 var Index = Directory.GetCurrentDirectory().LastIndexOf("bin"); var strpath = Directory.GetCurrentDirectory().Remove(Index) + @"try_Create\try20190227.py"; ScriptRuntime pyRuntime = Python.CreateRuntime();//創建Python運行時 dynamic py = pyRuntime.UseFile(strpath);//執行這個PY文件 string a = py.str_add();//調用這個方法 Console.WriteLine(a); Console.ReadKey(); #endregion
實際使用中發現不能調用使用了第三方類庫的方法,即使按照【轉載】這篇文章中的sys.path.append()插入了類庫依然會提示相關錯誤信息,
在測試過程中注冊一個Python代碼:

# -*- coding:UTF-8 -*- import sys import time import sys reload(sys) sys.setdefaultencoding('utf8') sys.path.append(r'F:\tensorflow\untitled_20190227') sys.path.append(r'F:\tensorflow\untitled_20190227\venv\Scripts\python36.zip') sys.path.append(r'F:\tensorflow\untitled_20190227\venv') sys.path.append(r'F:\tensorflow\untitled_20190227\venv\lib\site-packages') sys.path.append(r'F:\tensorflow\untitled_20190227\venv\lib\site-packages\setuptools-39.1.0-py3.6.egg') sys.path.append(r'F:\tensorflow\untitled_20190227\venv\lib\site-packages\pip-10.0.1-py3.6.egg') sys.path.append(r'F:\tensorflow\untitled_20190227\venv\lib\site-packages\win32') sys.path.append(r'F:\tensorflow\untitled_20190227\venv\lib\site-packages\win32\lib') sys.path.append(r'F:\tensorflow\untitled_20190227\venv\lib\site-packages\Pythonwin') import numpy from trysms import trys20190227 def str_add(): fp = open("test.txt",'w') #直接打開一個文件,如果文件不存在則創建文件 time = time.localtime(time.time()) strs=str(time.tm_year)+'年'+str(time.tm_mon)+'月'+str(time.tm_mday)+'日 '+str(time.tm_hour)+':'+str(time.tm_min)+':'+str(time.tm_sec) sms=trys20190227.str_add('196','4') fp.writelines(strs) fp.writelines(' \r\n計算結果:'+str(sms)) x = numpy.zeros(6) #創建一維長度為6的,元素都是0一維數組 fp.writelines(' \r\n #創建一維長度為6的,元素都是0一維數組:'+str(x)) x = numpy.zeros((2,3)) #創建一維長度為2,二維長度為3的二維0數組 fp.writelines(' \r\n #創建一維長度為2,二維長度為3的二維0數組'+str(x)) x = numpy.ones((2,3)) #創建一維長度為2,二維長度為3的二維1數組 fp.writelines(' \r\n #創建一維長度為2,二維長度為3的二維1數組:'+str(x)) x = numpy.empty((3,3)) #創建一維長度為2,二維長度為3,未初始化的二維數組 fp.writelines(' \r\n #創建一維長度為2,二維長度為3,未初始化的二維數組:'+str(x)) fp.close() return 'true'
然后通過上述中的方法二進行調用,發現即使注入后依然提示
經過查找發現__future__屬於numpy庫內部引用,
由於3.6版本的python應該默認包函__future__這個類庫,除非是2.x版本的python。。
結果還是不能調用三方庫,這還是只調用了一個numpy庫的操作結果,如果有更多引用庫可能更加引用復雜,嵌套層數更多。。
GG