暂无菜单项

Python项目封装打包避坑:3步搞定依赖冲突与库管理

发布于
5
聊天室

登录后参与聊天

聊天室只对登录用户开放!

将本人所进行的实际测试,针对 Python 3.9.7 与 PyInstaller 5.13.0 的组合,在过程时遭遇了动态链接库路径遗失、所依赖的包版本相互产生阻碍此类情况,如果是刚开始接触的新手,只要依照所列出的步骤按部就班地去实施操作,便能够较为容易地躲开这类较为常见的问题。

如何用 uv 管理依赖版本锁定

开启终端,于项目根目录开展 uv init进行初始化操作,随后实施运行uv add requests等于2.31.0,pandas等于2.0.3。最关键的要点在于,当生成 pyproject.toml 这个文件之后,一定要明确执行 uv lock,这么做的话,就会生成 uv.lock 文件,而这个文件当中,锁死了全部间接依赖的精确哈希值。

【新手需防入坑】,常见出现报错情况为 ERROR: No matching distribution found,其缘由是由于未对版本进行锁定从而致使拉取到了不兼容的包,核心出现错误的地方在于直接采用 pip install 这种方式却忽略了子依赖冲突。解决方案是,将venv以及uv.lock予以删除,再次去执行uv lock –upgrade – package requests以此来强行让版本达成对齐。

打包时隐藏导入怎么配

于项目根目录之中,创建名为hook – xxx.py的文件,其路径乃是hooks/hook – my_module.py ,将内容写入hiddenimports = [‘my_module.sub1′,’my_module.sub2’]。随后,去执行 pyinstaller main.py –additional-hooks-dir=hooks ,对于像 pandas 这种复杂的库,所推荐的参数数值是 –hidden-import=pandas._libs.tslibs。

面对新手需避的坑,运行exe时出现提示ModuleNotFoundError: No module named ‘pandas._libs.tslibs’,这种情况的缘由是,PyInstaller在分析依赖之际遗漏了呈现动态导入之态的底层C扩展。有个能快速解决问题的办法,那就是,在spec文件的Analysis部分中那个hiddenimports所构成的列表里,手工把缺失的项目添加进去,之后再重新进行打包,这样就可以了。

两种打包方案对资源文件的影响

情形一:单文件样式 pyinstaller -F main.spec ,此样式的好处是单个 exe 进行分发较为简便,不足之处是启动的速度较为迟缓,并且所依赖的源自外部的资源文件务必放置于 exe 相同的目录之下。情形二:单目录样式 pyinstaller -D main.spec。优点在于,借助sys._MEIPASS能够精确地将资源解压至临时目录,资源读取状况稳定,适宜于项目之中包含较多图片以及配置文件的场景。

需要注意,新人要避开这个坑,在单文件模式的时候,特别容易出现报错,报错内容是 Failed to execute script ,为啥会这样,原来是因为通过 os.getcwd() 去获取路径的时候,根本就没办法找到相关资源。核心解决流程是,先去运行print(sys._MEIPASS)来查看临时解压路径,接着运用os.path.join(sys._MEIPASS, ‘config.ini’)去拼接路径。要是不适用单文件模式,那就直接切换回单目录模式,使用–add-data”config.ini;.”参数重新打包是最省事的。

适用于标准Python项目的上述方法,要是你用的是Nuitka编译器,或者是涉及Cython混合编译的复杂工程,那么依赖的二进制库会存在更深层次的符号表冲突。提议首先采用本文之 uv lock 去锁定版本,接着借助 ldd 或者 Dependency Walker 来检查所生成的动态库链接状态,以防因环境变量缺失致使闪退。你于打包之际有无碰到 exe 运行报错然而终端却不展现任何日志的那种“静默崩溃”情形呢?欢迎留言予以交流。

0 讨论
热门最新
总结
暂无总结
0 / 600