.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