写在前面
最近写了一个python爬虫的脚本,想打包放上Github的Release,又不想用pyinstaller
偶然间发现了Pystand这个项目,打算尝试一下
项目地址
开始打包
准备工作
1.首先准备好要打包的项目
这是我给Mfuns写的一个小工具,可以把网盘外链转成直链
2. 下载嵌入式Python包
这里选择Python3.8.10 的32位版本嵌入包,因为Python3.8.10 是最后一个支持Win7的版本,使用32位可以使得包更紧凑
下载完以后解压缩,在前面准备好的项目文件夹下新建runtime
目录,把解压得到的文件放到里面去
编译PyStand项目
PyStand的Release页只提供了GUI版本,但我这是一个命令行脚本,因此必须手动编译
同时我也想更换一下图标
以下内容参考了这位大佬的文章
下载cmake & 安装C++编译器
Cmake
我选择直接下载便携版(zip后缀),然后把里面的bin目录添加到PATH
C++编译器
因为还不太懂C++,选择直接安装Visual Studio的C++环境 = ̄ω ̄=
编译!
首先Clone PyStand的仓库 git clone https://github.com/skywind3000/PyStand
换图标:只要替换根目录下的
appicon.ico
文件即可
新建一个文件夹build文件夹存放编译过程中的文件 mkdir build && cd build
开始Configure
cmake -S .. -B . -DPYSTAND_CONSOLE=ON -A Win32
# -DPYSTAND_CONSOLE=ON指定了生成的是一个控制台项目,如果你要生成GUI项目删去它或者改成OFF即可
# -A Win32指定生成的是32位应用
编译
cmake --build . --config Release
# --config Release指定编译的版本的Release版本而不是Debug版本
然后应该能在Release文件夹下找到PyStand.exe
文件,把它复制到最开始准备好的项目文件夹中
准备第三方库
准备第三方库有两种方法:
- 第一种是利用另一个同版本纯净Python的虚拟环境
- 第二种是直接在Python embeddable版本中安装pip来安装,第二种方法可以看看大佬的文章
我用的是第一种方法
先在沙盒中安装与嵌入版同版本的Python
创建虚拟环境
C:\Users\WDAGUtilityAccount>python -m venv test
在虚拟环境中安装依赖
首先在PyCharm到处requirements.txt文件
在工具
中选择同步Python要求
(sync python requirements)
这会在项目根目录下生成requirements.txt文件,把它拷贝到刚才创建的虚拟环境test的目录所在的目录中
安装依赖
# 先激活虚拟环境
C:\Users\WDAGUtilityAccount>test\Scripts\activate
# 安装依赖
(test) C:\Users\WDAGUtilityAccount>pip install -r requirements.txt
安装完成后,把test\Lib\site-packages
目录下没用的依赖删掉,然后把整个site-packages
文件夹复制到最开始准备好项目文件夹下
小修小补
修改Python文件
为了确保各个python文件都能顺利加载,我修改了Mftools.py文件,加入了以下内容
sys.path.append(r'.\src')
sys.path.append(r'.\site-packages')
sys.path.append(r'.\plugins\pan_transfer')
同时在pan_transfer.py文件中也加入了,因为不加入就会报错
sys.path.append(r'.\src')
sys.path.append(r'.\site-packages')
sys.path.append(r'.\plugins\pan_transfer')
其实我还不太清楚为什么用了subprocess
后原本的模块搜索目录列表会无法生效,之后可以试试import
修改文件名
这是项目作者的说明:
PyStand.exe的功能是:
- 自动加载 PyStand.exe 同级目录下面 runtime 子目录内的 Embedded Python
- 自动启动 PyStand.exe 同级目录下面的 PyStand.int 程序(Python 代码)
- 如果改名,会加载对应名称的 .int 文件,比如改为 MyDemo.exe 就会加载 MyDemo.int
- 会自动添加 PyStand.exe 同级目录下的 site-packages 目录,库可以放到里面
我这个项目是通过根目录的Mftools.py
用subprocess
运行子目录下的py文件实现的
因此我需要把根目录下的Mftools.py
更名为Mftools.int
,同时将PyStand.exe
更名为Mftools.exe
到这里就打包完成了,可以在命令行里打开Mftools.exe
看看有没有有没问题