在win10下写了一个python抽签程序,需要搬到统信os下去运行,但没有root权限,不能安装tkinter或qt5组件,所以要把python应用打包成单一可执行文件。

python应用打包可用pyinstaller,要打包统信os下能运行,需要在统信os下进行打包。

virtualbox安装统信os v20

从统信官网下载统信os v20的iso文件,安装到virtualbox。

打开开发者模式:

安装python环境和组件

1
2
3
sudo apt update
sudo apt install python3-pip
pip3 install pyinstaller

安装pyinstaller会出错,原因是典型的缺少编译依赖或pip 版本过旧。

1
2
3
4
5
sudo apt install build-essential python3-dev zlib1g-dev libssl-dev
##升级 pip 和 setuptools
python3 -m pip install --upgrade pip setuptools wheel
##再次安装pyinstaller
pip3 install pyinstaller

运行pyinstaller,提示命令没找到,pyinstaller安装在~/.local/bin,此路径还没有被系统“PATH环境变量”纳入搜索范围的目录里。
nano ~/.bashrc
在最后面加上:

1
2
# 添加用户本地 bin 目录到 PATH
export PATH="$HOME/.local/bin:$PATH"

使配置生效:

1
source ~/.bashrc

打包应用

1
pyinstaller --onefile lottery.py

打包过程的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
qs1@qs1-uos:~/Downloads/测试/测试$ /home/qs1/.local/bin/pyinstaller --onefile lottery.py
79 INFO: PyInstaller: 5.13.2
79 INFO: Python: 3.7.3
79 INFO: Platform: Linux-6.6.28-amd64-desktop-hwe-x86_64-with-uos-20-eagle
80 INFO: wrote /home/qs1/Downloads/测试/测试/lottery.spec
82 INFO: Extending PYTHONPATH with paths
['/home/qs1/Downloads/测试/测试']
217 INFO: checking Analysis
217 INFO: Building Analysis because Analysis-00.toc is non existent
217 INFO: Initializing module dependency graph...
218 INFO: Caching module graph hooks...
226 INFO: Analyzing base_library.zip ...
589 INFO: Loading module hook 'hook-encodings.py' from '/home/qs1/.local/lib/python3.7/site-packages/PyInstaller/hooks'...
812 INFO: Loading module hook 'hook-heapq.py' from '/home/qs1/.local/lib/python3.7/site-packages/PyInstaller/hooks'...
1100 INFO: Loading module hook 'hook-pickle.py' from '/home/qs1/.local/lib/python3.7/site-packages/PyInstaller/hooks'...
1907 INFO: Caching module dependency graph...
1983 INFO: running Analysis Analysis-00.toc
2002 INFO: Analyzing /home/qs1/Downloads/测试/测试/lottery.py
2114 INFO: Loading module hook 'hook-platform.py' from '/home/qs1/.local/lib/python3.7/site-packages/PyInstaller/hooks'...
2115 INFO: Processing module hooks...
2119 INFO: Loading module hook 'hook-_tkinter.py' from '/home/qs1/.local/lib/python3.7/site-packages/PyInstaller/hooks'...
2119 INFO: checking Tree
2119 INFO: Building Tree because Tree-00.toc is non existent
2119 INFO: Building Tree Tree-00.toc
2123 INFO: checking Tree
2123 INFO: Building Tree because Tree-01.toc is non existent
2123 INFO: Building Tree Tree-01.toc
2124 WARNING: Tcl modules directory /usr/share/tcltk/tcl8.6/../tcl8 does not exist.
2130 INFO: Looking for ctypes DLLs
2130 INFO: Analyzing run-time hooks ...
2131 INFO: Including run-time hook '/home/qs1/.local/lib/python3.7/site-packages/PyInstaller/hooks/rthooks/pyi_rth__tkinter.py'
2139 INFO: Looking for dynamic libraries
2482 INFO: Looking for eggs
2484 INFO: Python library not among binary dependencies. Performing additional search...
2567 INFO: Using Python library /lib/x86_64-linux-gnu/libpython3.7m.so.1.0
2568 INFO: Warnings written to /home/qs1/Downloads/测试/测试/build/lottery/warn-lottery.txt
2577 INFO: Graph cross-reference written to /home/qs1/Downloads/测试/测试/build/lottery/xref-lottery.html
2585 INFO: checking PYZ
2585 INFO: Building PYZ because PYZ-00.toc is non existent
2585 INFO: Building PYZ (ZlibArchive) /home/qs1/Downloads/测试/测试/build/lottery/PYZ-00.pyz
2722 INFO: Building PYZ (ZlibArchive) /home/qs1/Downloads/测试/测试/build/lottery/PYZ-00.pyz completed successfully.
2726 INFO: checking PKG
2726 INFO: Building PKG because PKG-00.toc is non existent
2726 INFO: Building PKG (CArchive) lottery.pkg
5403 INFO: Building PKG (CArchive) lottery.pkg completed successfully.
5406 INFO: Bootloader /home/qs1/.local/lib/python3.7/site-packages/PyInstaller/bootloader/Linux-64bit-intel/run
5406 INFO: checking EXE
5406 INFO: Building EXE because EXE-00.toc is non existent
5406 INFO: Building EXE from EXE-00.toc
5406 INFO: Copying bootloader EXE to /home/qs1/Downloads/测试/测试/dist/lottery
5406 INFO: Appending PKG archive to custom ELF section in EXE
5427 INFO: Building EXE from EXE-00.toc completed successfully.

成功后会在当前目录下生成build和dist两个目录,可执行文件在dist目录下。

验证

生成可执行文件在当前统信os里可双击运行。
在文件上点右键,选属性,把权限管理下的允许以程序执行勾上。再双击,会出现是否要运行的提示框,选运行。



python应用可以打开并正常运行。
qt版本也可以顺利打包并执行。
这两个可执行文件在debian13和kde neon上都可以正常运行。

打包在统信 UOS 上操作,不要跨系统打包。
PyInstaller 不具备交叉编译能力,必须在统信 UOS 系统上运行打包命令。如果是在 Windows 上打包,生成的是 .exe 文件,无法在 Linux 上运行。打包应用是因为没有权限安装tkinter或qt5组件,不使用这两个组件的话,python应用(.py)是可以在uos下用python3 app.py的方式运行的,此时的应用是在无界面的形式下运行,没有窗体,只在终端console中有显示。

vb程序的跨系统运行
vb做的小型应用单文件,使用方便,要在uos下运行,需要在应用商店里安装”统信windows兼容引擎“,这个应用把wine包装好以兼容更多应用,不需自己手动配置。简单vb程序(没有使用第三方组件)在uos下双击运行,会自动添加vb组件vbctl并正确执行。抽签程序原来有vb版本,可以直接搬过来用。
好消息是目标机器上的统信os已经有tkinter和qt,可以直接执行带gui的py程序,但依然是不支持安装第三方组件。