.NET Core奇技淫巧之WinForm使用Python.NET并打包
之前整了一个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所在文件夹
- 执行命令:
.\python.exe get-pip.py
- 然后执行命令:
.\python.exe -m pip
这样,我们就发现pip可以正常使用了
3.通过pip命令下载所需的包.
我这里因为使用的pandas解析的excel所以需要安装pandas,命令如下:
.\python.exe -m pip install --upgrade pandas -t Lib\site-packages\
.\python.exe -m pip install --upgrade openpyxl -t Lib\site-packages\
这里我们通过-t 指定下载到嵌入式python的相对文件夹下,方便我们打包
4.将安装好包的python目录复制到Winfrom项目下,并设置复制到输出目录.
类似如图:

5.通过Nuget安装Python.NET包.
如图:

6.编写WinFrom加载和点击事件
这里就不贴其他控件了,没啥内容.
我们在窗体加载的时候初始化python的环境,代码如下:
private void AdminForm_Load(object sender, EventArgs e)
{ string pythonPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "pythone");
string pythonDll = Path.Combine(pythonPath, "python313.dll");
Runtime.PythonDLL = pythonDll;
PythonEngine.Initialize(); }
在按钮点击的时候,调用python类,去生成对应的SQL语句,代码如下:
private void button2_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBox1.Text))
{
MessageBox.Show("请选择文件!");
return;
} using (Py.GIL())
{
dynamic sys = Py.Import("sys"); //导入sys模块
string sitePackagesPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "pythone", "Lib", "site-packages"); //设置site-packages路径
string scripts= Path.Combine(AppDomain.CurrentDomain.BaseDirectory);//设置python脚本所在路径
sys.path.append(sitePackagesPath);//添加site-packages路径
sys.path.append(scripts);//添加python脚本路径
dynamic np = Py.Import("gen_sql_fromexcel"); //导入python脚本 np.generate_sql_from_excel(textBox1.Text, Environment.CurrentDirectory + "/output.sql"); //调用python脚本中的方法 }
MessageBox.Show("生成成功!请到根目录查看."); }
注释里已经解释了对应代码的作用.(注意,一定要设置依赖包的路径 也就是site-packages路径的)
这样就完成了整个调用的过程.
.NET Core奇技淫巧之WinForm使用Python.NET并打包的更多相关文章
- c# winform UI + python底层的一点尝试
鉴于python做winform之类的UI比较弱.于是想结合C#的winform 和 python的底层开发(windows平台). 尝试做了一个RSS阅读器.在这里:http://download. ...
- python开发环境配置和python源码打包生成exe可执行文件
Windows下开发环境准备 1.分别安装:python2和python32.安装Python的集成工具:Anaconda3.安装Pycharm Pycharm设置 设置: File->Sett ...
- python模块的打包
python模块的打包方法: http://blog.csdn.net/five3/article/details/7847551
- Python Windows下打包成exe文件
Python Windows 下打包成exe文件,使用PyInstaller 软件环境: 1.OS:Win10 64 位 2.Python 3.7 3.安装PyInstaller 先检查是否已安装Py ...
- Python服务Debian打包新思路
此文已由作者张耕源授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Debian 打包一直是比较冷僻的技术,大部分同学都不会接触到它. 但是我们 Debian 服务器上安装的各 ...
- Python selenium chrome打包exe后禁用控制台输出滚动日志
Python selenium chrome打包exe后,在运行的过程中,如果遇到需要input()输入时,会发现被不断滚动刷新的日志把命令行输入快速顶掉了,通过查阅资料不断实践,发现以下方法有效: ...
- ASP.NET Core 奇技淫巧之接口代理转发
前言 先讲讲本文的开发背景吧.. 在如今前后端分离的大背景下,咱的客户又有要求啦~ 要前后端分离~ 然因为种种原因..没办法用用纯前端的框架(其实是学习成本高,又没钱请前端开发人员)... 所以最终决 ...
- python模块的打包setuptools
样例代码:新建test.py文件,内容如下: print "show me" 新建一个setup.py编译文件,内容如下: from distutils.core import s ...
- Python学习笔记(一):Python代码的打包与发布
在python程序中,一个.py文件被当作一个模块,在各个模块中定义了不同的函数.当我们要使用某一个模块中的某一个函数时,首先须将这个模块导入,否则就会出现函数未定义的情况. 下面记录的是打包及安装包 ...
- python下py2exe打包笔记
1.下载与python版本一致的py2exe插件包 2.安装py2exe,安装后在python目录下存在:\Lib\site-packages\py2exe\... 3.新建一个python脚本文件, ...
随机推荐
- [转]在WorldWind中加入*.x格式的三维模型
Nasa支持的WorldWind项目最近推出了1.4RC5版,可以加入三维模型,效果如下图所示: 点击查看大图 WW1.4对XML配置文件增加了许多新的元素,其中ModelFeature就是用来增加三 ...
- IM跨平台技术学习(七):得物基于Electron开发客服IM桌面端的技术实践
本文由得物技术团队Uni分享,即时通讯网收录时有内容修订和排版优化. 一.引言 本文要分享的是得物技术团队基于Electron开发客服IM桌面端的技术实践过程,内容包括桌面技术选型.Electron的 ...
- 2025-01-04:不包含相邻元素的子序列的最大和。用go语言,给定一个整数数组 nums 和一个由二维数组 queries 组成的查询列表,其中每个查询的格式为 queries[i] = [pos
2025-01-04:不包含相邻元素的子序列的最大和.用go语言,给定一个整数数组 nums 和一个由二维数组 queries 组成的查询列表,其中每个查询的格式为 queries[i] = [pos ...
- C Primer Plus 第6版 第七章 编程练习参考答案
编译环境VS Code+WSL GCC 源码请到文末下载 . 注意:本章部分题目有些超纲(回用到函数调用),不理解的同学可以先去看一下后面的知识点和注释. /*第1题***************** ...
- 微服务实战系列(九)-注册中心与网关高可用架构设计-copy
1. 微服务关系架构图 简要说明: (1)所有应用或者服务要想对外提供服务(包括网关),必须首先到注册中心进行注册. (2)所有访问通过服务网关进行访问,然后由服务网关路由到对应服务中心进行交互访问. ...
- Hadoop 概述(三)
HDFS shell API HDFS作为大数据的文件系统,可以放置数据文件,列举几个常用的shell脚本命令,用法和linux中的基本类似,不过这个是hadoop里的一套,所以我们要用hadoop ...
- [docker逃逸] Privileged 特权模式逃逸复现
本文作者CVE-柠檬i CSDN:https://blog.csdn.net/weixin_49125123 博客园:https://www.cnblogs.com/CVE-Lemon 微信公众号:L ...
- Mac安装NTL库
Mac安装NTL库 NTL是一个高性能.可移植的C++库,为任意长度的整数提供数据结构和算法:用于整数和有限域上的向量.矩阵和多项式:以及任意精度的浮点运算. 具有以下功能: 任意长度整数运算和任意精 ...
- 记录在本地电脑部署自己的DeepSeek 大模型AI
大家新年好呀,年初二给各位拜年啦,祝各位新年身体健康,工作顺利,万事如意,开心快乐每一天! 前言: 这几天看到很多DeepSeek的热点新闻(火的不行呀),去了解下这个AI,然后自己试了下本地部署,发 ...
- 一个登录功能也能玩出这么多花样?sa-token带你轻松搞定多地登录、单地登录、同端互斥登录
需求场景 说起登录,你可能会不屑一顾,还有比这更简单的功能吗? 获取一下用户提交参数 username + password 和数据库中一比对,有记录返回[登录成功],无记录返回[用户名或密码错误] ...