.net调用python源码方法---不能调用第三方库


【转载】

前言

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'
View Code

然后通过上述中的方法二进行调用,发现即使注入后依然提示

经过查找发现__future__属于numpy库内部引用,

由于3.6版本的python应该默认包函__future__这个类库,除非是2.x版本的python。。

结果还是不能调用三方库,这还是只调用了一个numpy库的操作结果,如果有更多引用库可能更加引用复杂,嵌套层数更多。。

GG

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM