Python脚本文件打包成Windows可执行程序格式

banner

前言

近些月来,笔者和几位同学在给实习公司开发一个工具,内容为利用C-5因子模型为加密货币排序(模型详见:Value Premium, Network Adoption, and Factor Pricing of Crypto Assets )。由于本学渣文科出身,写码水平实在有限,只好现学Python来做我们的项目(这里不是说Python垃圾,只是说上手容易,大佬轻喷)。而经过这几个月的爆肝,整体程序结构已经初具样貌。

然而,由于老板的要求,我们最终要交付的程序需要可以在Windows上直接运行,而我们知道,Python开发完后的所有文件,都是py格式的脚本文件如:xxx.py。而这样的文件想要在Windows电脑上运行,则需这台电脑安装了python环境,且在环境中配置了所有的程序所需的第三方库,这显然对于不懂技术的甲方来说属于不可承受之重了。

于是,为了甲方的方便着想,我们便需要将*.py文件打包成.exe的格式,而在使用谷歌搜索法学习后,本人找到了打包的方法,即使用pyinstaller,这篇博客主要记录下整体的流程。


程序结构简介

整个程序结构其实很简单(毕竟业余写码水平),主要就是按照C5模型论文分了几个阶段:1. 拉取数据、2. 预处理数据、3. 因子计算、4. 模型拟合、5. 排名并输出结果。

然后为了程序结构清晰,我们将其分为多个文件夹,在其中定义不同的方法/函数来实现上述的步骤,最终程序由主入口文件访问。

图中红框内的为核心文件,其余的是调试时生成的无用文件。

而打包程序时,其实只需将程序文件主入口(我们使用main.py)进行exe封装,其余的会被自动打包进文件。


pyinstaller安装

pyinstaller的安装很简单,只需输入如下代码:

1
pip install pyinstaller

这里需要注意的是,我们必须在想要打包的程序相应的虚拟环境下运行上述代码,否则其默认会将Python全局环境打包,导致程序无法启动。


pyinstaller使用

pyinstaller的使用也很容易,只需输入:

1
pyinstaller -F main.py

其中,-F参数表示将文件打包成一份文件,如果不加则默认输出一个文件夹,可以按需要使用。这里本人测试下来单文件打包所需空间较小,于是就用了单文件的方式。

而对于程序图标,我们也可以自定义,只需在目录下放一张.ico格式的图片,然后将代码修改为:

1
pyinstaller -F -i xxx.ico main.py

效果

当跑完上述代码后,程序目录便会出现dist文件夹,我们便可以在其中找到main.exe,将其拷贝到程序根目录便可以了。

直接运行效果:


Hidden-Import

有些时候,程序依赖运行的某些文件会被pyinstaller忽视,导致最终的成品文件无法运行,例如我们的加密货币分析项目中,用到了sklearn包,而其中的sklearn.utils._typedefs默认不会被导入,这就会让程序中途弹出,此时,便可以在pyinstaller中使用--hidden-import参数,手动加入需要的依赖:

1
pyinstaller -F main.py --hidden-import="sklearn.utils._typedefs"

至于这里具体要导入哪些文件,则需根据你自己的程序报错日志来选取。