《地下城與勇士:對決》Steam頁面上線 支援中文字幕配音
阿新 • • 發佈:2022-05-18
共嘗試了三種方式,引用了以下三個
using IronPython.Hosting; using Microsoft.Scripting.Hosting; using Python.Runtime;
Python.Runtime需要是 .net standard 類庫 我用的是.net.0
1.沒有引用第三方的時候可以, 引用第三方就會找不到第三方 例如 找不到import的paddleocr
ScriptRuntime pyRuntime = IronPython.Hosting.Python.CreateRuntime(); dynamic obj = pyRuntime.UseFile(@"D:\Develop\TEST\OCR\OCRdemo.py"); dynamic dy = obj.my_ocr(@"C:\Users\Thinkpad\Pictures\0\258.jpg"); Console.WriteLine(dy.ToString());
2.這種方式可以把py檔案的內容執行出來,分為兩種(同步獲取和非同步回撥兩種方式)
2.1、同步
Process p = new Process(); //環境安裝路徑 (已經配置了系統變數指向了paddle38,所以可以直接寫python.exe) p.StartInfo.FileName = @"python.exe"; //dll+空格+引數 p.StartInfo.Arguments = @"D:\Develop\TEST\OCR\OCRdemo.py C:\Users\Thinkpad\Pictures\0\258.jpg";//引數以空格分隔,如果某個引數為空,可以傳入”” p.StartInfo.UseShellExecute = false; //必需 p.StartInfo.RedirectStandardOutput = true;//輸出引數設定 p.StartInfo.RedirectStandardInput = true;//傳入引數設定 p.StartInfo.CreateNoWindow = true; p.Start(); string output = p.StandardOutput.ReadToEnd(); p.WaitForExit();//關鍵,等待外部程式退出後才能往下執行} Console.Write(output);//輸出 p.Close(); //txt1.Text = output;
備註:傳參方式 直接空格接在檔名後面,python裡接引數要寫 例如:sys.args[1] 以下是python程式碼
from paddleocr import PaddleOCR import sys def my_ocr(img_path): ocr = PaddleOCR(lang='ch') result = ocr.ocr(img_path) for line in result: print(line) return result if __name__ == '__main__': # print(len(sys.argv)) if len(sys.argv) > 1 : arg1 = sys.argv[1] else: arg1 = r'C:\Users\Thinkpad\Pictures\0\259.jpg' r1 = my_ocr(arg1) # for line in r1: # print(line) print("main ok") # pass
2.2、非同步回撥
public static void function2() { Process p = new Process(); //string path = "OCRdemo.py";//待處理python檔案的路徑,本例中放在debug資料夾下 string sArguments = @"D:\Develop\TEST\OCR\OCRdemo.py"; string[] strArr = new string[1]; strArr[0] = @"C:\Users\Thinkpad\Pictures\0\258.jpg"; foreach (var sigstr in strArr)//新增引數 { sArguments += " " + sigstr; } p.StartInfo.FileName = @"python.exe"; //python2.7的安裝路徑 p.StartInfo.Arguments = sArguments;//python命令的引數 p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; p.Start();//啟動程序 p.BeginOutputReadLine(); p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived); //Console.ReadLine(); p.WaitForExit(); } private static void p_OutputDataReceived(object sender, DataReceivedEventArgs e) { if (!string.IsNullOrEmpty(e.Data)) { Console.WriteLine(e.Data); //此處在控制檯輸出.py檔案print的結果 } }
以上兩種 py檔案可以放在任意路徑。
3.這種 我電腦暫時沒執行出來,別的電腦可以
PythonEngine.Initialize(); var pyThread = PythonEngine.BeginAllowThreads(); var pyLock = PythonEngine.AcquireLock(); //多執行緒呼叫,先鎖定執行緒,最後再釋放執行緒 功能同using (Py.GIL()){} Console.WriteLine("開啟執行緒,鎖定執行緒"); //using (Py.GIL()) //Initialize the Python engine and acquire the interpreter lock //{ // import your script into the process dynamic AL = Py.Import("test1");//python指令碼檔名 string image_path = @"C:\Users\Thinkpad\Pictures\0\258.jpg"; AL.main(image_path); Console.WriteLine("執行測試圖片後多執行緒無報錯");