【转载】
前言
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