找回密码
 立即注册
首页 业界区 业界 .NET Core奇技淫巧之WinForm使用Python.NET并打包 ...

.NET Core奇技淫巧之WinForm使用Python.NET并打包

这帜 3 天前
前言之前整了一个GZY.EFCoreCompare 的库,可以用做对比实体与数据库结构.感兴趣可以去看看,地址:GZY.EFCoreCompare
但是只能导出execl表格.
后来大佬用Python写了个类,可以将execl表格直接生成SQL语句.  但是需要通过开发工具 或者python环境去运行.
对现场的非技术人员很不友好..所以就想着用WinForm包装一个UI界面.
废话不多说,我们开始正文
 
正文.NET Core目前主流的和python交互的类库有两个. CSnakes 和 Python.NET
我是两个类库都试过了,虽然CSnakes性能可能更好,但是需要采用依赖注入的形式去使用,
而且虚拟环境需要科技上网才能下载,对WinForm并不太友好,所以后来放弃了.
Python.NET则可以直接使用嵌入式的python版本来作为环境,相对WinForm比较友好,所以这里采用Python.NET来与python进行交互
1.下载嵌入式的python


  • 打开链接: https://www.python.org/downloads/windows/
  • 下载 Windows embeddable package (64-bit) 版本
2.处理嵌入式的python无法使用pip的问题


  • 解压后编辑 python313._pth (这里是3.13版本,根据版本编辑),取消注释 import site
  • 下载 https://bootstrap.pypa.io/pip/get-pip.py 到python.exe所在文件夹
  • 执行命令: 
    1. .\python.exe get-pip.py
    复制代码
     
  • 然后执行命令:
    1. .\python.exe -m pip
    复制代码
    这样,我们就发现pip可以正常使用了
3.通过pip命令下载所需的包.

   我这里因为使用的pandas解析的excel所以需要安装pandas,命令如下:
  1. .\python.exe -m pip install --upgrade pandas -t Lib\site-packages\
复制代码
  1. .\python.exe -m pip install --upgrade openpyxl -t Lib\site-packages\
复制代码
这里我们通过-t 指定下载到嵌入式python的相对文件夹下,方便我们打包
4.将安装好包的python目录复制到Winfrom项目下,并设置复制到输出目录.

类似如图:
1.png

 
5.通过Nuget安装Python.NET包.

如图:
2.png

 
6.编写WinFrom加载和点击事件

这里就不贴其他控件了,没啥内容.
我们在窗体加载的时候初始化python的环境,代码如下:
  1. private void AdminForm_Load(object sender, EventArgs e)
  2. {
  3.      string pythonPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "pythone");
  4.      string pythonDll = Path.Combine(pythonPath, "python313.dll");
  5.      Runtime.PythonDLL = pythonDll;
  6.      PythonEngine.Initialize();
  7. }
复制代码
在按钮点击的时候,调用python类,去生成对应的SQL语句,代码如下:
  1.         private void button2_Click(object sender, EventArgs e)
  2.         {
  3.             if (string.IsNullOrEmpty(textBox1.Text))
  4.             {
  5.                 MessageBox.Show("请选择文件!");
  6.                 return;
  7.             }
  8.          
  9.             using (Py.GIL())
  10.             {
  11.                 dynamic sys = Py.Import("sys"); //导入sys模块
  12.                 string sitePackagesPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "pythone", "Lib", "site-packages"); //设置site-packages路径
  13.                 string scripts= Path.Combine(AppDomain.CurrentDomain.BaseDirectory);//设置python脚本所在路径
  14.                 sys.path.append(sitePackagesPath);//添加site-packages路径
  15.                 sys.path.append(scripts);//添加python脚本路径
  16.                 dynamic np = Py.Import("gen_sql_fromexcel"); //导入python脚本
  17.                 np.generate_sql_from_excel(textBox1.Text, Environment.CurrentDirectory + "/output.sql"); //调用python脚本中的方法
  18.             }
  19.             MessageBox.Show("生成成功!请到根目录查看.");
  20.         }
复制代码
注释里已经解释了对应代码的作用.(注意,一定要设置依赖包的路径  也就是site-packages路径的)
这样就完成了整个调用的过程.
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册