cmd后台运行exe_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来执行脚本。理论完美契合。

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

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

a615eb4e6d6dbdafc13feaa5ad810115.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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值