当前位置: 首页 > 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主要新特性
  • [PHP内核探索]PHP中的哈希表
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 2018一半小结一波
  • Angular 响应式表单 基础例子
  • angular2 简述
  • ComponentOne 2017 V2版本正式发布
  • Date型的使用
  • javascript数组去重/查找/插入/删除
  • JS笔记四:作用域、变量(函数)提升
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Promise初体验
  • Redash本地开发环境搭建
  • supervisor 永不挂掉的进程 安装以及使用
  • vue中实现单选
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 回顾2016
  • 解决iview多表头动态更改列元素发生的错误
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 三栏布局总结
  • 突破自己的技术思维
  • 我有几个粽子,和一个故事
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 异步
  • 与 ConTeXt MkIV 官方文档的接驳
  • 阿里云ACE认证学习知识点梳理
  • ​Python 3 新特性:类型注解
  • # Java NIO(一)FileChannel
  • #pragma once与条件编译
  • (39)STM32——FLASH闪存
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (四)Linux Shell编程——输入输出重定向
  • (转) ns2/nam与nam实现相关的文件
  • .NET Micro Framework 4.2 beta 源码探析
  • .net 生成二级域名
  • .NET企业级应用架构设计系列之技术选型
  • .vue文件怎么使用_我在项目中是这样配置Vue的