1. 程式人生 > 遊戲 >《地下城與勇士:對決》Steam頁面上線 支援中文字幕配音

《地下城與勇士:對決》Steam頁面上線 支援中文字幕配音

共嘗試了三種方式,引用了以下三個

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("執行測試圖片後多執行緒無報錯");