赞
踩
后台功能使用Python开发,Python无界面,通过将Python代码打包成exe后调用,并且能够跟C#窗体应用进行连接。在这个过程中设计了Python、C#、打包及两者之间的传参等过程,会出现各种各样的问题,笔者根据自己的经历对这整个过程进行了总结。声明一下我是使用的pycharm这个集成开发环境,且各种环境变量已经设置好,所以请先确认自己的环境变量,关于环境变量的设置比较简单,在此不再详细展开,不会的请自行百度。
1、Python相关问题
(1)库的安装
Python拥有庞大的标准库和第三方库,可以满足各种需求,因此在使用Python的时候,不可避免的要应用各种库,但是在安装库的时候难免会碰到安装失败或者版本不匹配等各种问题。由此总结了几个库的安装方法。安装库的方法如下:
a、通过pip命令直接安装
打开PyCharm,并打开需要添加库的项目。在主菜单中选择“View”->“Tool Windows”->“Terminal”,打开终端界面。在终端输入pip install [library_name],其中[library_name]是需要安装的库的名称。按下回车键,等待安装过程完成。如果需要安装的库有依赖项,pip会自动下载并安装它们。
b、通过File-settings-Project Interpreter安装
打开PyCharm,并打开需要添加库的项目。在主菜单中选择“File”->“Settings”,打开配置对话框。
在对话框左侧导航栏中,选择“Project: [your_project_name]”->“Python Interpreter”。在Python解释器设置页面上,找到右侧的“+”号,点击它。
在弹出的对话框中,输入要安装的库的名称,然后点击“Install Package”按钮。稍等片刻,PyCharm就会自动下载并安装所选库及其依赖项。
c、 下载对应版本的.whl文件安装
以上两种安装方式虽然简单,但是经常会碰到版本不匹配的问题。相比较于上述两种方法,使用接下来讲的这种方式安装基本不会遇到问题。以安装GDAL库为例,详细描述安装过程。
首先去下载对应版本的.whl文件(https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal),其他库以此类推找到对应的下载地址,然后找到对应python版本的文件,cp37代表python3.7,win_amd64代表你的电脑是64位的,下载的GDAL版本需要和你的python版本对应,自己电脑上python版本可以通过点击python的IDLE来查看。
下载完成后将.whl文件放在python安装目录下\Scripts文件下接着点击路径栏,输入cmd后点击确定。在弹出的cmd中输入pip install GDAL-3.3.3-cp310-cp310-win_amd64.whl,然后点击确定即可安装3.7版本的GDAL库。
2、打包
首先安装与Python适配版本的pyinstaller,安装方法见第一条。其次,pyinstaller添加到环境变量里面,这样就可以在系统的任何位置使用pyinstaller这个命令了。然后找到待打包的.py文件所在的文件夹,shift+鼠标右键选择 在此处打开命令窗口,这样当前路径已经在这个文件夹了,用命令 pyinstaller -F 文件名字.py,会看到程序已经在跑了。一会能看到文件夹中多出了一个dist文件夹,一个build文件夹和一个.spec文件(文件名和.py文件的文件名一致)。dist是发布文件夹,我们想要的.exe文件就在里面。
打包时可能遇到的问题:
打开命令行输入.\文件名.exe回车发现错误:ModuleNotFoundError:No module named typedefs
这是由于有些库不能自动导入导致的,具体解决方法可参考pyinstaller机器学习含sklearn打包遇到的各种问题_pyinstaller sklearn_素颜___man的博客-CSDN博客
3、C#与Python传参
C#部分
- string debugPath = System.Environment.CurrentDirectory; //此c#项目的debug文件夹路径
- string Path = debugPath + "\\DBSCAN.exe";
-
- Process p = new Process();
- p.StartInfo.FileName = Path;//需要执行的文件路径
- p.StartInfo.UseShellExecute = false; //必需
- p.StartInfo.RedirectStandardOutput = true;//输出参数设定
- p.StartInfo.RedirectStandardInput = true;//传入参数设定
- p.StartInfo.CreateNoWindow = true;
- //p.StartInfo.Arguments = "2 3";//参数以空格分隔,如果某个参数为空,可以传入””
- //p.StartInfo.Arguments = "'"+ textBox6.Text+"'";
- string a = textBox2.Text + " " + textBox3.Text + " " + textBox1.Text;
- p.StartInfo.Arguments = a;
- p.Start();
- string output = p.StandardOutput.ReadToEnd();
- p.WaitForExit();//关键,等待外部程序退出后才能往下执行
- if(output=="")
- {
- MessageBox.Show("出现错误!");
- }
- p.Close();
Python部分
- import sys
-
- filename = sys.argv[6]
- demgrid, proj, geotrans, row, column, band, type = read_npgrid(filename)
- oridata = demgrid
- # 计算各个统计值
- glcmfeaturename = sys.argv[5]
-
-
- nbit = int(sys.argv[3])
- kernel_size = int(sys.argv[4])
- distance = float(sys.argv[2])
- angle = float(sys.argv[1])
这里要注意一个问题,WinForm框架中的信息传入到Python生成的可执行文件中,其传入的信息是以字符串的形式传入,因此如果需要传入数值,需要在Python中对传入的参数进行类型转换。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。