C# と Python の間の対話により、Python が OpenCV やその他のサードパーティ ライブラリを呼び出し、配布時に Python 環境を構成するという問題が完全に解決されます。

ヒント: 記事を作成した後、目次を自動的に生成できます。生成方法は、右側のヘルプドキュメントを参照してください。


序文

C# が Python を呼び出す方法については、インターネット上に、ironPython、Python コードを exe にパッケージ化するもの、プロセス クラスを通じて Python を呼び出すものなど、多くのソリューションがありますが、これらのソリューションには多かれ少なかれ欠点があります。サードパーティのライブラリ、exe にパッケージ化されている、実行が遅すぎるなど。この記事では主に、ProcessクラスがPythonを呼び出して他の人に配布する際に、Python環境をインストールする際の問題の解決策を提案します。


提示:以下是本篇文章正文内容,下面案例可供参考

1. 問題分析

C# が Python を呼び出す方法には、C# の Process クラスを使用してプロセスを作成するという非常に古典的な解決策があります。このプロセスは実際には Python インタプリタ用に開発されており、このプロセスを通じて Python コードを完全に呼び出すことができます。このソリューションの原理は、実際には、Python インタープリターを使用して自分で Python コードを実行するのと同じですが、「Python インタープリターを使用する」プロセスが手動で実行されるのではなく、C# によってプロセス クラスを通じて自動的に実行される点が異なります。以下のキーコードを参照してください

            Process P = new Process();
            //当前debug目录路径
            string curPath = System.Environment.CurrentDirectory;
            //需要调用的python代码文件
            string path =  curPath + "\\" + sArgName;
            //python解释器的路径
            P.StartInfo.FileName = curPath + "\\" + "python3\\python.exe";
            //传递的参数,注意,参数数组从0开始索引,第0个参数永远是python代码路径
            //从第一个参数开始是函数的形参
            string sArguments = path;

ここには 2 つの問題があります。1
つ目は、サードパーティのライブラリが Python コードで呼び出されるとき、Python インタプリタはサードパーティのライブラリの場所をどのようにして知るのでしょうか。
次に、Python をインストールしていないユーザーに配布する場合、ユーザーが Python をダウンロードせずに直接使用できるようにするにはどうすればよいでしょうか。

2、解決策

最初の質問

3 番目のライブラリが Python コードで参照されている場合、Python インタープリタは、兄弟ディレクトリ、環境変数、および手動で追加されたディレクトリから対応するライブラリを検索します。これは、Python のインストール ディレクトリから理解できます。次の図は、作成者の Python インストール ディレクトリです
ここに画像の説明を挿入
。Python.exe を呼び出すと、同じレベルのディレクトリにある LIB フォルダ内の対応する site-packages フォルダが検索されます。 -party ライブラリが見つかった場合は正常に実行されますが、見つからなかった場合はエラーが報告されます。

2番目の質問

ユーザーに配布する場合、ユーザーが Python 環境をインストールしていない場合、ユーザー側で対応するモジュールが見つからないため、コンピューター上で実行できるコードはエラーを報告します。一般的な解決策は、ユーザー向けに Python 環境をインストールすることですが、これは間違いなくユーザー エクスペリエンスに影響します。最良の解決策は、配布されたプロジェクト ファイルで Python 環境を構成することです。
最初の質問から着想を得て、Python インタープリターは同じディレクトリ内でサードパーティのライブラリとその他の依存ファイルを検索します。その後、プロジェクト ファイル内に新しい Python フォルダーを作成し、その中に Python 環境を構成できます。具体的な操作は非常に簡単で、Python インタープリターがインストールされているフォルダーの内容をすべてコピーするだけです。もちろん、この場合、フォルダーは非常に大きくなる可能性があります。これは通常、サイト パッケージに多くのサードパーティ ライブラリが含まれているためです。コピーするときにサイト パッケージに関連するライブラリを保持するだけでよく、スペースを減らすために他の無関係なライブラリをすべて削除する必要があります。たとえば、著者のデモでは、C# は画像を表示するために Python の opencv を呼び出す必要があるため、opencv を保持する必要がありますsite-packages と numpy ライブラリで十分です。下記参照
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

3. 結果とソースコード

 private void button2_Click(object sender, EventArgs e)
        {
    
    
            //打开图片文件
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = "请选择图片文件";
            ofd.InitialDirectory = @"C:\Users\17116\Desktop";
            ofd.Filter = "图片文件|*.*";
            ofd.ShowDialog();
            url = ofd.FileName;
            string[] strArr = new string[2];//参数列表
            string sArgName = "main.py";//调用的.py文件名
            //strArr[0] = textBox1.Text;
            //strArr[1] = textBox2.Text;
            strArr[0] = url;
            RunpythonScript(sArgName, strArr);//运行python
        }

        public static void RunpythonScript(string sArgName, params string[] teps)
        {
    
    
            Process P = new Process();
            //当前debug目录路径
            string curPath = System.Environment.CurrentDirectory;
            //需要调用的python代码文件
            string path =  curPath + "\\" + sArgName;
            //python解释器的路径
            P.StartInfo.FileName = curPath + "\\" + "python3\\python.exe";
            //传递的参数,注意,参数数组从0开始索引,第0个参数永远是python代码路径
            //从第一个参数开始是函数的形参
            string sArguments = path;
            foreach (string sigter in teps)
            {
    
    
                sArguments += " " + sigter;//传递参数,两次之后为 路径 参数一 参数二
            }
            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();//在应用程序的output流上异步读取数据
            P.OutputDataReceived += new DataReceivedEventHandler(P_OutputDataReceived);//事件触发器,有新的数据就读取
            P.WaitForExit();
        }
        //用于C#和python之间字符串类型数据的传递
        static void P_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
    
    
            //if (!string.IsNullOrEmpty(e.Data))//如果字符串存在
            //{
    
    
            //    MessageBox.Show(Convert.ToString(e.Data));//显示结果
            //}

        }

main.pyのPythonコード

import cv2
import sys

def add(a,b):
    return (float(a) + float(b))

def imgshow(path):
    img = cv2.imread(path)
    cv2.imshow("img",img)
    cv2.waitKey()

imgshow(sys.argv[1])
# print(add(sys.argv[1],sys.argv[2]))

# if __name__ == '__main__':
#     print(add(sys.argv[1],sys.argv[2]))

図の [画像の選択] ボタンをクリックすると、C# が main.py ファイルを呼び出し、opencv を通じて画像を表示します。
ここに画像の説明を挿入
ここに画像の説明を挿入

4. まとめ

この記事では、process クラスを通じて Python を呼び出します。Python のサードパーティ ライブラリを使用でき、ユーザーに配布するときに Python 環境をインストールする必要はありません。しかし、まだ欠点があります。それは、画像などの非文字列型のデータ送信の問題です。これらは2つの異なる処理であり、pythonで処理した画像データを、ファイルを読み込まずに直接c#のメモリに読み込む方法(非常に遅い)が、その後の改善方向です。
最後に、テストされていない C# から Python を呼び出すためのアイデアをいくつか挙げます:
1. Python.NET ライブラリを使用する: Python.NET は、.NET プラットフォーム上で Python コードを実行するためのライブラリであり、C# 間のリンクを提供します。および Python インターフェイス。Python.NET ライブラリを使用して、C# プログラムから Python コードを呼び出すことができます。

2. Pyjion を使用する: Pyjion は、Python コードを .NET マシン コードにコンパイルできるオープン ソース JIT コンパイラーです。Pyjion を使用すると、コンパイルされた Python コードを C# プログラムから呼び出すことができます。
PS 完全なコードが必要な場合は、このリンクからダウンロードできます。ブロガーもリソースをダウンロードするにはクレジットが必要です。興味のある方は、より多くのサポートをお願いします。完全なコードのダウンロード

おすすめ

転載: blog.csdn.net/bookshu6/article/details/128283187