前言

之前整了一个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

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并打包的更多相关文章

  1. c# winform UI + python底层的一点尝试

    鉴于python做winform之类的UI比较弱.于是想结合C#的winform 和 python的底层开发(windows平台). 尝试做了一个RSS阅读器.在这里:http://download. ...

  2. python开发环境配置和python源码打包生成exe可执行文件

    Windows下开发环境准备 1.分别安装:python2和python32.安装Python的集成工具:Anaconda3.安装Pycharm Pycharm设置 设置: File->Sett ...

  3. python模块的打包

    python模块的打包方法: http://blog.csdn.net/five3/article/details/7847551

  4. Python Windows下打包成exe文件

    Python Windows 下打包成exe文件,使用PyInstaller 软件环境: 1.OS:Win10 64 位 2.Python 3.7 3.安装PyInstaller 先检查是否已安装Py ...

  5. Python服务Debian打包新思路

    此文已由作者张耕源授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Debian 打包一直是比较冷僻的技术,大部分同学都不会接触到它. 但是我们 Debian 服务器上安装的各 ...

  6. Python selenium chrome打包exe后禁用控制台输出滚动日志

    Python selenium chrome打包exe后,在运行的过程中,如果遇到需要input()输入时,会发现被不断滚动刷新的日志把命令行输入快速顶掉了,通过查阅资料不断实践,发现以下方法有效: ...

  7. ASP.NET Core 奇技淫巧之接口代理转发

    前言 先讲讲本文的开发背景吧.. 在如今前后端分离的大背景下,咱的客户又有要求啦~ 要前后端分离~ 然因为种种原因..没办法用用纯前端的框架(其实是学习成本高,又没钱请前端开发人员)... 所以最终决 ...

  8. python模块的打包setuptools

    样例代码:新建test.py文件,内容如下: print "show me" 新建一个setup.py编译文件,内容如下: from distutils.core import s ...

  9. Python学习笔记(一):Python代码的打包与发布

    在python程序中,一个.py文件被当作一个模块,在各个模块中定义了不同的函数.当我们要使用某一个模块中的某一个函数时,首先须将这个模块导入,否则就会出现函数未定义的情况. 下面记录的是打包及安装包 ...

  10. python下py2exe打包笔记

    1.下载与python版本一致的py2exe插件包 2.安装py2exe,安装后在python目录下存在:\Lib\site-packages\py2exe\... 3.新建一个python脚本文件, ...

随机推荐

  1. Qt音视频开发39-人脸识别在线版

    一.前言 关于人脸识别这块,前些年不要太火,哪怕是到了今天依然火的一塌糊涂,什么玩意都要跟人脸识别搭个边,这东西应该只是人工智能的一个很小的部分,人脸识别光从字面上理解就是识别出人脸区域,其实背后真正 ...

  2. Qt开源作品12-硬盘容量控件

    一.前言 磁盘容量统计控件,说白了,就是用来统计本地盘符占用的容量,包括但不限于已用空间.剩余空间.总大小.已用百分比等,其中对应的百分比采用进度条显示,该进度条的前景色和背景色及文字颜色可以设置,在 ...

  3. 你的语言模型实际是一个奖励模型!😁Direct Preference Optimization:Your Language Model🎭is Secretly a Reward Model

    直接偏好优化:你的语言模型实际上是一个奖励模型 其实每张PPT图下面还有解释的注释,但放上去还要改格式,太多啦!所以就靠大家读论文脑补啦! 摘要 1.引言 2.相关工作 3.预备知识 4.直接偏好优化 ...

  4. [转]【Qt-license】误操作qt下载导致只能安装商业版试用十天,无法安装社区版

    背景:原本是为了学习qml,需要下载一个design studio,而这个需要比较新版的安装程序,但新版的安装程序官方都是online安装.于是从官网找下载链接.毕竟是英文的,又心急,误打误撞中我选择 ...

  5. 使用CRM REST Builder的Predefined Query在js结合FetchXML语句进行查询

    一般情况下使用拓展工具RESTBuilder编辑器,可以很方便的进行操作js中增删改查均能实现,但在某些较为特殊的场景下,需要根据条件去拼接查询过滤条件的,使用编辑器生成的代码无法实现,需要结合使用f ...

  6. Note - 速通 NPC?有限域算术!

    浅谈有限域在 OI 中的一些应用 (2023 国家集训队论文), 戚朗瑞.   \(\textbf{Example 1.}\)   给定一张有向图 \(G=(V,E)\), \(|V|=n\), \( ...

  7. ABP 系列总结

    2019年第一次接触 ABP 框架,那时候还是比较笨重的旧版本的,后来升级到 vNext 版本,我也基于 ABP 模块化的设计方式开发了一些模块用于日常工作.这个系列主要为了系统地记录一下日常工作与学 ...

  8. 微服务技术架构、监控、Docker、服务治理等详解

    1.什么是微服务 1)一组小的服务(大小没有特别的标准,只要同一团队的工程师理解服务的标识一致即可) 2)独立的进程(java的tomcat,nodejs等) 3)轻量级的通信(不是soap,是htt ...

  9. LinkedList的源码

    LinkedList LinkedList是通过双向链表去实现的,他的数据结构具有双向链表的优缺点,既然是双向链表,那么的它的顺序访问效率会非常高,而随机访问的效率会比较低,它包含一个非常重要的私有内 ...

  10. Django和FastAPI的比较

    在 Python 的 Web 开发领域,Django 和 FastAPI 是两款备受瞩目的框架. 通过对二者的实践与比较,本文总结了它们的特点与适用场景,希望能给开发者在选择时提供参考. 1. 设计理 ...