M1 Mac按照源仓库本地打包App可以成功打开应用,但点击开始按钮就没反应了
blacklein opened this issue · 22 comments
复现步骤如下:
Step 1
Download and extract arm64 version from 'realesrgan-ncnn-vulkan'
curl -L "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.5.0/realesrgan-ncnn-vulkan-20220424-macos.zip" -o realesrgan-ncnn-vulkan-20220424-macos.zip
unzip -o realesrgan-ncnn-vulkan-20220424-macos.zip
rm -f realesrgan-ncnn-vulkan-20220424-macos.zip input.jpg input2.jpg onepiece_demo.mp4
lipo realesrgan-ncnn-vulkan -extract arm64 -output realesrgan-ncnn-vulkan-arm64
rm -f realesrgan-ncnn-vulkan
mv realesrgan-ncnn-vulkan-arm64 realesrgan-ncnn-vulkan
chmod u+x realesrgan-ncnn-vulkan
Step 2
Create and activate virtualenv
python3 -m venv ./realgui
source ./realgui/bin/activate
Step 3
Install dependcies
pip3 install -r requirements.txt
Step 4
Create macOS App Bundle
sudo pyinstaller realesrgan-gui.spec
猜测是不是跟最近commit的完成通知有关
直接在终端里运行这个用 lipo 处理过的 realesrgan-ncnn-vulkan
的话可以正常运行吗?
如果要判断是不是完成通知的问题的话,可以用添加这个之前的最后一个 commit 21ea1fabca41bfc13c6f9d5ac9d7bc5fe00d14c3
试试看。
直接在终端里运行这个用 lipo 处理过的
realesrgan-ncnn-vulkan
的话可以正常运行吗?如果要判断是不是完成通知的问题的话,可以用添加这个之前的最后一个 commit
21ea1fabca41bfc13c6f9d5ac9d7bc5fe00d14c3
试试看。
试了前一个commit,用build.sh打包出来的app可以正常运行,这样看来问题应该是出在最新通知的commit里
试了一下,如果是在点击开始处理的那个按钮的函数中出现错误的话会直接显示到 stdout 里,所以打包之后双击运行就看不到报错信息了。
试试把 spec 文件里面的 EXE(console=False)
这里改成 True
再打包,这样运行的时候应该会出现一个终端,再点击开始的话应该会有报错信息?
试了一下,如果是在点击开始处理的那个按钮的函数中出现错误的话会直接显示到 stdout 里,所以打包之后双击运行就看不到报错信息了。
试试把 spec 文件里面的
EXE(console=False)
这里改成True
再打包,这样运行的时候应该会出现一个终端,再点击开始的话应该会有报错信息?
试了改成true,但点击开始还是一样没动静,也没有终端窗口出现
不打包而是直接从源代码运行的话会不会出现同样的问题?
不打包而是直接从源代码运行的话会不会出现同样的问题?
源码运行没有这个问题,源码可以正常
那就只能用某种土方法来看出错提示了……
在 main.py
里把点击开始后的函数包上一层 try: ... except: ...
然后再打包试试看?
def buttonProcess_click(self):
try:
...
except:
messagebox.showerror(define.APP_TITLE, traceback.format_exc())
那就只能用某种土方法来看出错提示了……
在
main.py
里把点击开始后的函数包上一层try: ... except: ...
然后再打包试试看?def buttonProcess_click(self): try: ... except: messagebox.showerror(define.APP_TITLE, traceback.format_exc())
照着上面改了,打包成功,但点击开始后和之前一样,也没错误提示出来,没有终端窗口跳出,也没有其他报错窗口跳出,就是那么没反应了,开始按钮是灰色的,但就是没动静了
试一下把这里有关 notification
的部分都注释掉,看看还能不能正常运行?这两个 commit 之间除了这个就没有什么大的更改了(可以看一下 compare)
通知提醒用的是 notify-py,刚刚看了一下它在 macOS 上是通过附带的一个 .app 实现的,不知道是不是需要额外的处理(比如 xattr -rd
或者在 PyInstaller 打包时手动添加参数把它附带上之类的)。
试一下把这里有关
notification
的部分都注释掉,看看还能不能正常运行?这两个 commit 之间除了这个就没有什么大的更改了(可以看一下 compare)通知提醒用的是 notify-py,刚刚看了一下它在 macOS 上是通过附带的一个 .app 实现的,不知道是不是需要额外的处理(比如
xattr -rd
或者在 PyInstaller 打包时手动添加参数把它附带上之类的)。
如果是这个附带.app缺失导致的报错,那源码运行应该也会报错吧,我等下试试附带App看看
打包好的应用里确实没找到notify-py相关的内容,可能是缺失导致的问题,在spec中的hiddenimport里加了notify-py,但似乎没有作用,重新打包仍然没有增加notify-py内容
把site-package里的notifypy、notify_py-0.3.42.dist-info两个文件夹直接复制到打包好的.app的macOS文件夹下,就可以运行了,但这个方法有点歪门邪道的感觉,总感觉哪里不对,而且运行完毕后也没有通知跳出来
翻了一下 PyInstaller 的文档,附带这些包的额外文件应该是使用 --collect-data
这个参数,--hidden-import
是针对 Python 代码的,效果和在代码里写 import
是类似的。对应到 spec 文件的话:
import sys
from PyInstaller.utils.hooks import collect_data_files
a = Analysis(
datas=[
...,
*(collect_data_files('notifypy') if sys.platform == 'darwin' else []),
],
...
)
这里我也加了条件判断,因为只有 macOS 才需要附带那个 .app,类似地也可以判断 platform.machine() == 'arm64'
,这样一来似乎 spec 文件也可以合并成一个?
改过之后可以正常运行了,这样.spec和requirements.txt可以合并成一个,但是在M1 Mac上,notify和darkdetect一样,并没有发生作用,我去看了下,notify的那个.app是intel架构的,不是universal2架构,不知道是否这个原因所有不起作用。
requirements.txt可以合并成一个,但spec可能还是得两个,里面图标windows和macOS用的图标不一样,另外binary那里是跟build.sh里面对应的,要用build.sh来一键完成下载、虚拟环境、安装依赖、打包应用
notify-py 的作者说过在 M1 下可以使用的:ms7m/notify-py#28
repo 里没看到有人反映过打包后就没办法显示通知的问题,不过我也没办法进一步测试和尝试修复了……
另外我认为不应该在 requirements.txt
里面写上 pyinstaller
,毕竟从源代码运行并不等于需要打包,因为这个理由所以我一开始写 Actions 打包的时候 PyInstaller 也是使用命令单独安装的。
写上pyinstaller是因为虚拟环境里打包需要用到,因为虚拟环境不安装pyinstaller的话,会自动调用全局pyinstaller和全局库,打包出来的app可能无法运行,这个是为build.sh加上的
我的意思是可以改成在启用虚拟环境之后开始打包之前单独执行一个 pip3 install pyinstaller
😂
嗯,这样的话build.sh执行到虚拟环境就结束了,后面两步骤需要手动来操作,可能没那么方便,我自己是都可以的,按大佬你想要的revert吧
我的意思是可以改成在启用虚拟环境之后开始打包之前单独执行一个
pip3 install pyinstaller
😂
哦明白你意思了,只要改下build脚本,单独加上pip install pyinstaller就好了,我等会回去提交pr
然而我已经先加上了😂
好的哈