C#과 Python의 상호 작용으로 OpenCV 및 기타 타사 라이브러리를 호출하고 배포할 때 Python 환경을 구성하는 문제를 완벽하게 해결합니다.

Tip: 글 작성 후 자동으로 목차가 생성될 수 있으며, 생성 방법은 오른쪽 도움말 문서를 참고하시면 됩니다.


머리말

C#이 Python을 호출하는 방법과 관련하여 인터넷에는 ironPython, Python 코드를 exe로 패키징하는 솔루션, 프로세스 클래스를 통해 Python을 호출하는 솔루션 등 인터넷에 많은 솔루션이 있지만 이러한 솔루션에는 ironPython이 호출할 수 없는 것과 같은 결함이 다소 있습니다. 타사 라이브러리, exe로 패키징, 너무 느리게 실행 등 이 글은 주로 Process 클래스가 파이썬을 호출하여 다른 사람들에게 배포할 때 파이썬 환경을 설치하는 문제에 대한 해결책을 제시한다.


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

1. 문제 분석

C#이 Python을 호출하는 방법은 C#의 Process 클래스를 사용하여 프로세스를 생성하는 매우 고전적인 솔루션이 있습니다.이 프로세스는 실제로 Python 인터프리터를 위해 개발되었으며 이 프로세스를 통해 Python 코드를 완벽하게 호출할 수 있습니다. 이 솔루션의 원리는 "Python 인터프리터 사용" 프로세스가 수동으로 실행되지 않고 프로세스 클래스를 통해 C#에 의해 자동으로 실행된다는 점을 제외하면 Python 인터프리터를 사용하여 직접 Python 코드를 실행하는 것과 실제로 동일합니다. 아래 키코드 참조

            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;

여기에는 두 가지 문제가 있습니다.
첫째, Python 코드에서 타사 라이브러리가 호출될 때 Python 인터프리터는 타사 라이브러리의 위치를 ​​찾을 위치를 어떻게 알 수 있습니까?
둘째, Python을 설치하지 않은 사용자에게 배포할 때 어떻게 사용자가 Python을 다운로드하지 못하게 막고 직접 사용할 수 있습니까?

둘, 해결책

첫 번째 질문

세 번째 라이브러리가 Python 코드에서 참조되는 경우 Python 인터프리터는 형제 디렉터리, 환경 변수 및 수동으로 추가된 디렉터리에서 해당 라이브러리를 찾습니다. 파이썬 설치 디렉토리에서 알 수 있습니다.다음 그림은 저자의 파이썬 설치 디렉토리입니다
여기에 이미지 설명 삽입
.Python.exe를 호출하면 동일한 레벨 디렉토리의 LIB 폴더에서 해당 사이트 패키지 폴더를 검색합니다.세 번째 경우 -party 라이브러리가 발견되면 성공적으로 실행되고, 그렇지 않으면 오류를 보고합니다.

두 번째 질문

사용자에게 배포할 때 사용자가 Python 환경을 설치하지 않은 경우 컴퓨터에서 실행할 수 있는 코드는 사용자 측에서 해당 모듈을 찾을 수 없기 때문에 오류를 보고합니다. 일반적인 해결책은 사용자를 위해 Python 환경을 설치하는 것이지만 이는 사용자 경험에 영향을 미칠 것이므로 가장 좋은 솔루션은 배포된 프로젝트 파일에 Python 환경을 구성하는 것입니다.
첫 번째 질문에서 영감을 얻은 Python 인터프리터는 동일한 디렉터리에서 타사 라이브러리 및 기타 종속 파일을 찾은 다음 프로젝트 파일에 새 Python 폴더를 만든 다음 그 안에 Python 환경을 구성할 수 있습니다. 구체적인 작업은 매우 간단합니다. 파이썬 인터프리터가 설치된 폴더의 모든 내용을 복사하기만 하면 됩니다. 물론 이 경우 폴더가 매우 클 수 있는데, 이는 일반적으로 사이트 패키지에 타사 라이브러리가 많기 때문입니다. 복사할 때 사이트 패키지에 관련 라이브러리만 보관하고, 공간을 줄이기 위해 다른 관련 없는 라이브러리는 모두 삭제하면 됩니다. 사이트 패키지 및 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의 파이썬 코드

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. 요약

이 글은 프로세스 클래스를 통해 파이썬을 호출하고, 파이썬의 서드파티 라이브러리를 사용할 수 있으며, 사용자에게 배포할 때 파이썬 환경을 설치할 필요가 없습니다. 그러나 여전히 단점이 있습니다. 사진과 같은 문자열이 아닌 유형의 데이터 전송 문제입니다. 이 두가지 과정이 다른데 파이썬으로 처리한 그림 데이터를 파일을 읽는 것(매우 느릴 것임)이 아닌 C#의 메모리에 직접 불러오는 방법이 후속 개선 방향이다.
마지막으로 테스트되지 않은 C#에서 Python을 호출하는 몇 가지 방법을 나열합니다:
1. Python.NET 라이브러리 사용: Python.NET은 .NET 플랫폼에서 Python 코드를 실행하기 위한 라이브러리입니다. 및 Python.인터페이스. Python.NET 라이브러리를 사용하여 C# 프로그램에서 Python 코드를 호출할 수 있습니다.

2. Pyjion 사용: Pyjion은 Python 코드를 .NET 머신 코드로 컴파일할 수 있는 오픈 소스 JIT 컴파일러입니다. Pyjion을 사용하여 C# 프로그램에서 컴파일된 Python 코드를 호출할 수 있습니다.
추신: 전체 코드가 필요한 경우 이 링크에서 다운로드할 수 있습니다. 블로거도 리소스를 다운로드하려면 약간의 크레딧이 필요합니다. 관심 있는 사람들은 더 많은 지원을 제공하기를 바랍니다. 전체 코드 다운로드

추천

출처blog.csdn.net/bookshu6/article/details/128283187