PyInstaller天坑终极攻略
PyInstaller莫名报错?面对错误信息无从下手?翻遍全网找不到解决方法?面对PyInstaller中的那些莫名天坑不如和我一起手动打包python解释器和项目
大佬别走!我这里有:
- PyInstaller打包失败后的python打包exe攻略
- 便携式python的制作方法
- 便携式python安装pip攻略
- PyQt5运行时少这少那
- 使用QWebEngineView后缺失文件无法运行
- 便携式python运行PyQt5出现复古老界面
以上这些你想要的答案这里都有,请慢慢享用或直接查询所需
求赞,求关注,求收藏!
盘点PyInstaller的坑
等等等,代码写的多了错误也就不胜其数了,好了我就就不戳大家心窝子了,下面开始我们的正题
讲解案例:
使用PyQt5,QWebEngineView,jinja2,markdown2等库的一个项目打包exe
虽然我已经不想再提PyInstaller使用过程中遇到的错误了,但是不巧我们的案例讲解也是由一个错误开始的
Traceback (most recent call last):
File "E:\notebook\venv\lib\site-packages\PyInstaller\utils\hooks\__init__.py", line 329, in get_module_attribute
return _get_module_attribute(module_name, attr_name)
File "E:\notebook\venv\lib\site-packages\PyInstaller\isolated\_parent.py", line 269, in wrapped
return call(function, *args, **kwargs)
File "E:\notebook\venv\lib\site-packages\PyInstaller\isolated\_parent.py", line 238, in call
return isolated.call(function, *args, **kwargs)
File "E:\notebook\venv\lib\site-packages\PyInstaller\isolated\_parent.py", line 176, in call
raise RuntimeError(f"Child process call to {function.__name__}() failed with:\n" + output)
RuntimeError: Child process call to _get_module_attribute() failed with:
File "E:\notebook\venv\lib\site-packages\PyInstaller\isolated\_child.py", line 63, in run_next_command
output = function(*args, **kwargs)
File "E:\notebook\venv\lib\site-packages\PyInstaller\utils\hooks\__init__.py", line 325, in _get_module_attribute
return getattr(module, attr_name)
AttributeError: module 'markdown' has no attribute '__version__'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "D:\program\python\Python3.7.9\lib\runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "D:\program\python\Python3.7.9\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "E:\notebook\venv\Scripts\pyinstaller.exe\__main__.py", line 7, in <module>
File "E:\notebook\venv\lib\site-packages\PyInstaller\__main__.py", line 178, in run
run_build(pyi_config, spec_file, **vars(args))
File "E:\notebook\venv\lib\site-packages\PyInstaller\__main__.py", line 59, in run_build
PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs)
File "E:\notebook\venv\lib\site-packages\PyInstaller\building\build_main.py", line 934, in main
build(specfile, distpath, workpath, clean_build)
File "E:\notebook\venv\lib\site-packages\PyInstaller\building\build_main.py", line 856, in build
exec(code, spec_namespace)
File "E:\notebook\main.spec", line 20, in <module>
noarchive=False,
File "E:\notebook\venv\lib\site-packages\PyInstaller\building\build_main.py", line 381, in __init__
self.__postinit__()
File "E:\notebook\venv\lib\site-packages\PyInstaller\building\datastruct.py", line 173, in __postinit__
self.assemble()
File "E:\notebook\venv\lib\site-packages\PyInstaller\building\build_main.py", line 550, in assemble
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "E:\notebook\venv\lib\site-packages\_pyinstaller_hooks_contrib\hooks\stdhooks\hook-markdown.py", line 23, in <module>
if is_module_satisfies("markdown >= 3.3"):
File "E:\notebook\venv\lib\site-packages\PyInstaller\utils\hooks\__init__.py", line 487, in is_module_satisfies
version = get_module_attribute(module_name, version_attr)
File "E:\notebook\venv\lib\site-packages\PyInstaller\utils\hooks\__init__.py", line 331, in get_module_attribute
raise AttributeError(f"Failed to retrieve attribute {attr_name} from module {module_name}") from e
AttributeError: Failed to retrieve attribute __version__ from module markdown
说,这么长的东东有没有吓到你,
哎,面对它我们怎么办呢?解决是不可能解决的,额也可能是我菜,到现在也没搞明白~~
莫名其怪,明明码代码的时候运行的好好地就是打包不了,我们只能自己手动打包了.
思路: 将python解释器制作成便携版 然后加入我们的项目 最后补一个exe运行入口好了
便携版python制作
- 去python官网下载压缩包的python到本地解压(这里我用https://www.python.org/ftp/python/3.7.9/python-3.7.9-embed-amd64.zip)
- 下载get-pip.py文件(https://bootstrap.pypa.io/get-pip.py)
3.运行get-pip.py文件
注意:使用时python要写类似c:\user\python.exe这样具体地址
4.设置python自动寻找pip
找到和python.exe同目录下的python37._pth打开(具体看个人python情况)
去掉 import site 前的注释符号
注意:在执行pip 命令时要用 python -m pip
到此为止我们的便携式Python就完成了,接下来就是复制我们项目的时候了克隆包拷贝文件走一波
再把项目文件统统拷贝到python.exe同名目录,大功告成,别高兴的太早,转头运行,不说也罢
接下来处理PyQt5运行时文件找不到的情况
首先 Qt所需要的东西不在环境变量中找不到
qt.qpa.plugin: Could not find the Qt platform plugin “windows” in “”
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
当然网上最简单的方案是
找到python的路径,点击 \Lib\site-packages\PyQt5\Qt5\plugins\platforms
将该路径添加到环境变量中,变量名设为QT_QPA_PLATFORM_PLUGIN_PATH
不过俺是要发布软件给别人用啊,让人家去配环境变量?显然…
那么我的选择是
复制PyQt5\Qt\plugins下下的所有内容复制到到python.exe同目录下
别急,这时我运行,what?我电脑win11啊,怎么成xp界面了,
每错,在某些情况下,如在精简环境下的python程序打包中(我们用的就是便携版python),执行打包后的程序会出现窗体风格变为老式的win风格,这是由于打包时候PyQt的styles动态库没有找到。
因此只需要在Python 目录下找到 Lib\site-packages\PyQt5\Qt\plugins\styles,将styles整个目录复制到python.exe同层目录
最后又又又出现了Could not find QtWebEngineProcess.exe错误,相信看到这儿小伙伴们也和我一样心力憔悴
别慌
将PyQt5/Qt/bin(dist目录下也有)目录下的QtWebEngineProcess.exe和PyQt5/Qt/resource目录下的所有文件复制到dist目录下,解决问题。
这次运行 …/python.exe main.py 成功跑起
晒一张我当时的截图,看到这一幕我高兴的哭了
当然现在还仅仅是运行起来的,不要指望所有人都会像程序员一样老老实实敲
/python.exe main.py 我们还需要一个小小的脚本
from os import path
import sys
from win32api import ShellExecute
dirname = path.dirname(path.realpath(sys.argv[0]))
ShellExecute(0, 'open', path.join(dirname,'pythonw.exe'), path.join(dirname,'main.py'),dirname,1)# 第一个路径指定python.exe 第二个指定程序入口main.py 第三个路径是开始路径,相当于从D:\\users\\Desktop\\新建文件夹开始运行程序 , 这样能保证路径名不出现问题
之后,这里用了pythonw来调用,嗯毕竟论谁辛辛苦苦画的漂亮界面也不想看到一个黑框框出来扫兴.
还有获取py文件目录就用上面那个,其他不行,这就不得不说PyInstaller打包后exe运行问题了,它是解压到零时目录下运行的,其他语句得不到想要结果,路径会出错
最后我整个项目做出来大概600MB,大是大了点不过python就这样,在加上咱们没有压缩很正常.
终于完了,哦对了上述代码可以用PyInstaller打包个exe放python.exe目录下调用,那么短一个程序也不用怕出啥幺蛾子了
求点赞,求收藏,求关注
致谢:(是你们指引我走过了那段迷茫的时光~~~)
- pyinstaller 打包出现几类错误的一般解决方法(https://blog.youkuaiyun.com/qq_44703886/article/details/109763756)
- Windows下制作Python便携版(带pip)–Portable Python(https://blog.youkuaiyun.com/lizongti/article/details/123142634)
- Pyinstaller 打包发布经验总结(https://blog.youkuaiyun.com/weixin_42052836/article/details/82315118)
- 【Pyinstaller】打包并运行时报错:Could not find QtWebEngineProcess.exe的解决(https://blog.youkuaiyun.com/xhltk316/article/details/120283750)
- Pyinstaller路径问题,pycharm,exe,双用(https://www.cnblogs.com/jackadam/p/15837102.html)