两部分:1、使用pyinstaller打包xxx.py的项目文件,生成.exe文件;
2、简单C#的交互界面,实现.exe文件的调用与传参(文件名)。
c#实现功能:1)点击浏览文件夹,选中文件(文件路径供.exe使用),
2)点击浏览文件夹,再选中.exe文件;
3)点击,执行.exe文件;显示输出结果——string类型(xx.py中,print(“”)的内容)
本文实现的是基于pytorch1.6的python程序打包,(没有大量第三方库的更顺利,步骤一样)
下文中的两个参考链接重要。先看第二个链接,再看前面的打包步骤,以及报错参见第一个链接。
基于pytorch的神经网络程序,打包时注意下面的6、7项(否则.exe调用lib出错)
一、打包:
1)将文件精简,功能集中到一个main.py中的if __name__=="__main__":函数中,其中需要使用的文件(.txt,.csv,.pt.......)均使用相对路径(放在main.py当前目录下);
2)传参数,使用sys.args[x]方式,在cmd命令行中可以执行;
3)cmd中,进入到项目工作环境中,运行代码;
(参数,空格隔开->args[1] = 'aa', args[2]='text.txt')
4).py文件代码验证无误后,开始打包流程。安装pyinstaller库;
pip install pyinstaller
5)在当前的环境下,进入需要打包项目(main.py)路径中,执行如下;
图标若不需要,可以不用-i 以及后面的命令。.ico文件网站有专门的生成网站。
6)在这个项目中会出现buil(生成过程中的)、dist文件夹(结果)与main.spec(后续可能用到)。其中dist中有.所需要的exe文件。
7)在cmd中运行,报出第三方库错误,则需要。修改见:
(anaconda\envs\xxx\Lib\site-packgs\~~)中的第三库整个文件夹,复制conda虚拟环境中用pyinstaller打包python程序生成exe,调用第三方库_pingfan2014的博客-CSDN博客https://blog.csdn.net/pingfan2014/article/details/113436472 若找不到.py程序执行需要读取的文件(.txt等)也用上述方法,将文件拷贝到resource文件夹中,并修改.spec文件
二、C#调用实现代码
c#调用python的四种方法(尝试了四种,只详细讲解本人成功的后两种,其余方法只列出,详细用法请自行谷歌百度)_武林大皮虾的博客-CSDN博客_c#调用python
最简单的,使用了TextBlock、Label、button(触发操作)控件。读取文件夹,使用的openfiler在代码段,这里没有体现。
如下,为浏览文件夹,显示路径的代码。调用.exe参见上一个参考链接(特殊原因,不能全部分享)
using Microsoft.Win32; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.IO; using System.Diagnostics; namespace ASR_V0._1 { public partial class MainWindow : Window { OpenFileDialog Fp_Wav = new OpenFileDialog(); //使它为全局变量 OpenFileDialog Fp_Exe = new OpenFileDialog(); public MainWindow() { InitializeComponent(); } private void Button_Click(object sender, RoutedEventArgs e) { Fp_Wav.Filter = "音频文件|*.wav"; if (Fp_Wav.ShowDialog() == true) { textBlock.Text = Fp_Wav.FileName; } } private void Button1_Click(object sender, RoutedEventArgs e) /*“浏览”的点击事 { Fp_Exe.Filter = "应用程序|*.exe"; if (Fp_Exe.ShowDialog() == true) { textBlock1.Text = Fp_Exe.FileName; //显示选择的结果 } } private void Button2_Click(object sender, RoutedEventArgs e) { //调用程序 textBlock2.Text = output; //显示结果 } } }