当前位置: 首页 > news >正文

.net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道

本人最近喜欢上python,刚好又做audio相关的工作,就想用python做一个各种音频文件生成的小工具。运行效果如下图。但是想着给同事们都使用一下,但是别人不一定有python环境,就使用pyinstaller打包生成一个exe文件。谁知,exe文件30几M。惊吓。一顿搜索之后,开始了各种方案的尝试,什么pipenv,anaconda,UPX,mingw等等,一圈下来身心俱疲。柳暗之中突然想到本人电脑上只有一个现成的万能的微软巨无霸,我们要擅于站在巨人的肩膀上,瞬间感觉花要开了。结合前面两天对许多方案的遍历性尝试,大致有了思路。

基本原理是: python脚本运行的时候是在cmd命令行下,通过调用python安装目录下的python.exe xxx.py命令来的运行的。C++有机制可以调用外部exe可执行程序。既然这样那么可以写一个c++程序,在C++程序里面调用python.exe来执行脚本。理论完美契合。

74f4e533db8b46418e773509ece6b8b3.png
用VC后生成的单一exe文件,9K

89ef4f1db2ed80b47887e33335cf11d6.png
pyinstaller 打包后的单一exe文件,30几M

17df2ac5dc285218f3b14855973bca2b.png
运行效果图

作为工程师,闲言少叙,话不多说,直接上干货

https://blog.csdn.net/qingfengjuechen/article/details/102992446

https://blog.csdn.net/qingfengjuechen/article/details/103021189

// call_python_test4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// 此文件测试CreateProcess函数调用外部exe程序。一般情况会先打开cmd窗口,然后通过cmd控制台打开外部exe程序。
// 经过测试,可以做到启动外部程序后,瞬间关闭命令行窗口

#include "pch.h"
#include <iostream>
#include "windows.h"
#include <WinBase.h>
#include <minwinbase.h>
#include <string.h>
#include <tchar.h>
#include <assert.h>

void createProcess_nocmdwindow();
int main()
{
	createProcess_nocmdwindow();
	return 0;
}

/*OK*/
void createProcess_nocmdwindow()
{
	STARTUPINFO   StartupInfo;//创建进程所需的信息结构变量   
	PROCESS_INFORMATION   ProcessInfo;
	GetStartupInfo(&StartupInfo);
	StartupInfo.lpReserved = NULL;
	StartupInfo.lpDesktop = NULL;
	StartupInfo.lpTitle = NULL;
	StartupInfo.dwX = 0;
	StartupInfo.dwY = 0;
	StartupInfo.dwXSize = 0;
	StartupInfo.dwYSize = 0;
	StartupInfo.dwXCountChars = 500;
	StartupInfo.dwYCountChars = 500;
	StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
	StartupInfo.wShowWindow = SW_HIDE;
	//说明进程将以隐藏的方式在后台执行    
	StartupInfo.cbReserved2 = 0;
	StartupInfo.lpReserved2 = NULL;
	StartupInfo.hStdInput = stdin;
	StartupInfo.hStdOutput = stdout;
	StartupInfo.hStdError = stderr;

	BOOL   bRet;
    TCHAR appName[] = _T("E:study_pythongenera_sine_wav_filereleaserelease_win7general_2ch_sinwav_file.v1.300.exe");//OK no cmd window
	//TCHAR szCmdline[] = _T("D:Python37python.exe  E:general_2ch_sinwav_file.v1.300.py"); //this str is tesed, OK
	//TCHAR szCmdline[] = _T("D:Python37python.exe  D:Python37general_2ch_sinwav_file.v1.300.pyw"); //this str is tesed, OK
	//TCHAR szCmdline[] = _T(""D:Python37python.exe"  D:Python37general_2ch_sinwav_file.v1.300.pyw"); //this str is tesed, OK

	/* MS参考code:https://docs.microsoft.com/zh-cn/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessw */
	//LPTSTR szCmdlineline[] = _tcsdup(TEXT(""C:Program FilesMyApp" -L -S"));

	bRet = CreateProcess(NULL, szCmdline, NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &StartupInfo, &ProcessInfo);

	WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
	CloseHandle(ProcessInfo.hProcess);
	CloseHandle(ProcessInfo.hThread);
}

相关文章:

  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • echarts geo地图示例_echarts地图资源下载和pyecharts可视化报错解决方法汇总
  • unity怎么显示骨骼_Unity3d教程:骨骼动画介绍
  • python按1行6个_Python(六)
  • android 不通过数据线打印日志_android-studio – 无法使用Android Studio从JNI打印日志消息...
  • string字符串内容倒叙_面试题:String,StringBuffer 和StringBuilder三者的区别,以及如何实现一个字符串倒序?...
  • 地脚螺钉直径系列_地脚螺钉的作用,地脚螺钉直径规格!
  • redis课程视频 黄建宏_Redis从入门到精通 视频教程 下载
  • 是什么_格什么条?格拉什么?什么拉条?
  • fetch 自动加cookie_selenium自动化测试之--验证码处理
  • tomcat中的mdmp文件_Tomcat的使用(详细流程)
  • iot架构 mqtt netty_MQTT 协议是什么
  • echart 三维可视化地图_可视化地图是什么?推荐3个工具!
  • python修改json文件value值_python批量修改json文件
  • getpostdata php7.0_我整理的PHP 7.0主要新特性
  • 网络传输文件的问题
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • DOM的那些事
  • Java 23种设计模式 之单例模式 7种实现方式
  • JS 面试题总结
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • laravel5.5 视图共享数据
  • quasar-framework cnodejs社区
  • 回顾2016
  • 机器学习 vs. 深度学习
  • 基于HAProxy的高性能缓存服务器nuster
  • 浅谈web中前端模板引擎的使用
  • 一天一个设计模式之JS实现——适配器模式
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 阿里云重庆大学大数据训练营落地分享
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • #传输# #传输数据判断#
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (八)Flask之app.route装饰器函数的参数
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (理论篇)httpmoudle和httphandler一览
  • (力扣题库)跳跃游戏II(c++)
  • (七)理解angular中的module和injector,即依赖注入
  • (转)LINQ之路
  • (转)ObjectiveC 深浅拷贝学习
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • **CI中自动类加载的用法总结
  • .bat批处理(一):@echo off
  • .NET Core WebAPI中封装Swagger配置
  • .NET 读取 JSON格式的数据
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .net开发时的诡异问题,button的onclick事件无效
  • .NET企业级应用架构设计系列之技术选型
  • .ui文件相关