写在前面

最近写了一个python爬虫的脚本,想打包放上Github的Release,又不想用pyinstaller
偶然间发现了Pystand这个项目,打算尝试一下

项目地址

skywind3000/PyStand - Githubhttps://github.com/skywind3000/PyStand


开始打包

准备工作

1.首先准备好要打包的项目

the mftools troject

这是我给Mfuns写的一个小工具,可以把网盘外链转成直链

2. 下载嵌入式Python包

Python 3.8.10https://www.python.org/downloads/release/python-3810/


py3.8.10embeddable

这里选择Python3.8.10 的32位版本嵌入包,因为Python3.8.10 是最后一个支持Win7的版本,使用32位可以使得包更紧凑

下载完以后解压缩,在前面准备好的项目文件夹下新建runtime目录,把解压得到的文件放到里面去


编译PyStand项目

PyStand的Release页只提供了GUI版本,但我这是一个命令行脚本,因此必须手动编译

同时我也想更换一下图标

以下内容参考了这位大佬的文章

How-to-use-PyStand

下载cmake & 安装C++编译器

Cmake

Cmake downloadshttps://cmake.org/download/

我选择直接下载便携版(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

install py3.8.10 in winsandbox

创建虚拟环境

C:\Users\WDAGUtilityAccount>python -m venv test

在虚拟环境中安装依赖

首先在PyCharm到处requirements.txt文件

工具中选择同步Python要求(sync python requirements)
sync python requirements

导出requirements.txt文件
export requirements.txt

这会在项目根目录下生成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.pysubprocess运行子目录下的py文件实现的

因此我需要把根目录下的Mftools.py更名为Mftools.int,同时将PyStand.exe更名为Mftools.exe

最后的目录结构如下:
dir structure

到这里就打包完成了,可以在命令行里打开Mftools.exe看看有没有有没问题