本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1 问题背景
写了一个Pyside2的GUI程序, 现在需要部署到一个开发板上, 开发板的cpu是ARM架构的, 系统是Ubuntu18.04 Desktop版 我先在自己的ubuntu虚拟机上运行, 完全ok
然后用pyinstaller打包成可执行文件, 放到开发板上运行, 报错
cannot execute binary file: Exec format error
这种错误一般就是arch不对, 基于amd架构编绎的程序是不能在arm架构的机器上运行的, 指令集不对
2 在ARM架构下编绎
(1) 第一关
于是, 我通过SSH远程连接了arm架构的开发板, 准备用mkvirtualenv创建虚拟环境, 于是通过apt install virtualenv, 和virtualenvwrapper, 一顿操作之后, 嗯...我成功了, 成功把开发板系统玩废了, python3, apt统统没法正常使用了, 现在还在重装开发板的系统...
温馨提示: 千万不要在arm架构下用virtualenv创建虚拟环境, 建议用venv来做
(2) 第二关
那我就想, 要不在电脑上用VMware装个arm架构的linux镜像来编绎pyside2吧, one hour later...
(3) 第三关
还好, 公司还有一台mac mini, 刚好是M1芯片的, 是arm架构, 于是在上面一顿操作, 先下载了最新版的vmware fusion, 在上面安装各种ubuntu的arm-desktop.iso, 结果基本都卡在第一步
转念一想, 好像上面这个vmware fusion才是支持arm的第一个版本, 很可能有坑啊, 还是换Parallel Desktop吧 换上后一装, 哎, 怎么还是报这个错, 哎, 怎么一闪没了, woc, 进去了居然, 装好了nbaaaaa!!!.
(4) 第四关
然后开始装python3-pip, 再装包, pip install -r requirements.txt 哎, 在mac上操作虚拟机居然不共享剪贴板, 给虚拟机搞个桥接, 下个openssh-server, 远程终端操作
怎么唯独没有pyside2呢??? 升级下pip
woc, 还没有
google一下, 好家伙, 还不能这样装, 得像下面这样装
apt-get install python3-pyside2.qt3dcore python3-pyside2.qt3dinput python3-pyside2.qt3dlogic python3-pyside2.qt3drender python3-pyside2.qtcharts python3-pyside2.qtconcurrent python3-pyside2.qtcore python3-pyside2.qtgui python3-pyside2.qthelp python3-pyside2.qtlocation python3-pyside2.qtmultimedia python3-pyside2.qtmultimediawidgets python3-pyside2.qtnetwork python3-pyside2.qtopengl python3-pyside2.qtpositioning python3-pyside2.qtprintsupport python3-pyside2.qtqml python3-pyside2.qtquick python3-pyside2.qtquickwidgets python3-pyside2.qtscript python3-pyside2.qtscripttools python3-pyside2.qtsensors python3-pyside2.qtsql python3-pyside2.qtsvg python3-pyside2.qttest python3-pyside2.qttexttospeech python3-pyside2.qtuitools python3-pyside2.qtwebchannel python3-pyside2.qtwebsockets python3-pyside2.qtwidgets python3-pyside2.qtx11extras python3-pyside2.qtxml python3-pyside2.qtxmlpatterns
装完后, 运行试试
怎么还是找不到啊, 原来还要让这个虚拟环境加载系统包, 于是重新创个venv
python3 -m venv venv_stellar --system-site-packages
(5) 第五关
貌似可以了? 居然又报错了:
qt.qpa.xcb: could not connect to display qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
我想, 这可能是远程终端没有gui的原因吧, 去虚拟机gui终端上运行一下, 好了
(6) 第六关
哎, 我图片怎么都没了呀???
难道是, pyrcc编绎图片资源时, 不同架构的pyrcc编绎相同的图片会有不同的结果
于是, 我想换arm架构下的pyrcc工具重新编绎了一下qrc文件, 生成py文件
发现居然没有pyrcc, 要先装
sudo apt install qtbase5-dev-tools
发现装上去的居然是5.12的版本, 不支持rcc --generator=python
于是, 再去装了一个jammy ubuntu22.04 kylin
qtbase5-dev-tools这回倒是装上了, 也支持generator生成py代码,
但这系统更坑, git都装不上, ssh-server装上了也连不了,哎, 算了,放弃这种思路
(7) 第七关
既然qrc这关走不通, 我们就绕过qrc, 里面的资源访问不再采用":/xxx.png"的形式, 而是使用相对路径 "../qtrc/xxx.png" 结果放到arm架构下的ubuntu下运行python3 main.py, 完美解决
之后使用pyinstaller打包, 也能完美运行
3 避坑总结
-
- 不要在arm架构下的ubuntu上用virtualenv来创建虚拟环境, 而要用venv
-
- 不要在arm架构下用qrc, 这上面的qt不认识":/xxx.png", 建议全部改用相对路径"../你的资源路径/xxx.png"
-
- 不要妄想在amd架构上交叉编绎出arm架构的包, 现在pyinstaller还不支持