ubuntu22 python2 pyinstaller 打包报错:NoneType object has no attribute groups

news/发布时间2024/5/20 19:11:48

前言


最近有个需求,需要在 ubnutu22 上使用 pyinstaller 打包一个python2 的文件。

中间遇到了一些问题:

  1. pip2 install pyinstaller 报错
    解决方案:
pip2 install pyinstaller == 3.6
  1. python2 和 python3 的 pyinstaller 如何同时存在,我想把 python2 的 pyinstaller 命名为 pyinstaller2,

把 python3 的 pyinstaller 不重名。

# 如果安装了 python3 的 pyinstaller,需要先卸载
pip3 uninstall pyinstaller# 1. 安装python2 的 pyinstaller
pip2 install pyinstaller == 3.6
# 2. 找到 pyinstaller 位置 (我的环境是在 /usr/local/bin/pyinstaller)
whereis pyinstaller
# 3. 重命名 python2 的 pyinstaller 为 pyinstaller2
cd /usr/local/bin/
mv pyinstaller pyinstaller2
# 4. 检查
pyinstaller2 --version# 5. 重新安装 python3 的 pyinstaller
pip3 install pyinstaller# 6. 检查python3 的 pyinstaller
pyinstaller --version

然后,使用命令,打包出现报错

pyinstaller2 -F tst.py -p /usr/lib/python2.7/dist-packages/
1463 INFO: Python library not in binary dependencies. Doing additional searching...
Traceback (most recent call last):File "/usr/local/bin/pyinstaller2", line 8, in <module>sys.exit(run())File "/usr/local/lib/python2.7/dist-packages/PyInstaller/__main__.py", line 114, in runrun_build(pyi_config, spec_file, **vars(args))File "/usr/local/lib/python2.7/dist-packages/PyInstaller/__main__.py", line 65, in run_buildPyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs)File "/usr/local/lib/python2.7/dist-packages/PyInstaller/building/build_main.py", line 734, in mainbuild(specfile, kw.get('distpath'), kw.get('workpath'), kw.get('clean_build'))File "/usr/local/lib/python2.7/dist-packages/PyInstaller/building/build_main.py", line 681, in buildexec(code, spec_namespace)File "/mnt/wallE_code_u22/pytest/pythonApiTst/code_u22/christie3_ctl.spec", line 17, in <module>noarchive=False)File "/usr/local/lib/python2.7/dist-packages/PyInstaller/building/build_main.py", line 244, in __init__self.__postinit__()File "/usr/local/lib/python2.7/dist-packages/PyInstaller/building/datastruct.py", line 160, in __postinit__self.assemble()File "/usr/local/lib/python2.7/dist-packages/PyInstaller/building/build_main.py", line 478, in assembleself._check_python_library(self.binaries)File "/usr/local/lib/python2.7/dist-packages/PyInstaller/building/build_main.py", line 568, in _check_python_librarypython_lib = bindepend.get_python_library_path()File "/usr/local/lib/python2.7/dist-packages/PyInstaller/depend/bindepend.py", line 915, in get_python_library_pathpython_libname = findLibrary(name)File "/usr/local/lib/python2.7/dist-packages/PyInstaller/depend/bindepend.py", line 775, in findLibraryutils.load_ldconfig_cache()File "/usr/local/lib/python2.7/dist-packages/PyInstaller/depend/utils.py", line 400, in load_ldconfig_cachepath = m.groups()[-1]
AttributeError: 'NoneType' object has no attribute 'groups'

下面,将描述我的解决方案

正文


chatgpt 建议使用 sudo ldconfig 刷新共享库缓存,我试了但是还是报上面的错误。

后来 view /usr/local/lib/python2.7/dist-packages/PyInstaller/depend/utils.py 400 行,找到了报错的地方

try:text = compat.exec_command(ldconfig, ldconfig_arg)except ExecCommandFailed:logger.warning("Failed to execute ldconfig. Disabling LD cache.")LDCONFIG_CACHE = {}returntext = text.strip().splitlines()[splitlines_count:]LDCONFIG_CACHE = {}for line in text:# :fixme: this assumes libary names do not contain whitespacem = pattern.match(line)path = m.groups()[-1]if is_freebsd or is_openbsd:# Insert `.so` at the end of the lib's basename. soname# and filename may have (different) trailing versions. We# assume the `.so` in the filename to mark the end of the# lib's basename.bname = os.path.basename(path).split('.so', 1)[0]name = 'lib' + m.group(1)assert name.startswith(bname)name = bname + '.so' + name[len(bname):]else:name = m.group(1)# ldconfig may know about several versions of the same lib,# e.g. differents arch, different libc, etc. Use the first# entry.if not name in LDCONFIG_CACHE:LDCONFIG_CACHE[name] = path

这里path = m.groups()[-1] 的 m 是个 None 类型,然后 m的来源是 m = pattern.match(line), line 是获取共享库后逐行读取的字段。那就是 m = pattern.match(line) 出现了异常。

打印 m 报错 None 时 line 的值,发现此时 line: 缓存生成方: ldconfig (Ubuntu GLIBC 2.35-0ubuntu3.6) stable release version 2.35, 程序就是在解析这句时报错,原因是格式不匹配。

使用系统指令

sudo ldconfig -p

发现打印的信息最后一行就是:缓存生成方: ldconfig (Ubuntu GLIBC 2.35-0ubuntu3.6) stable release version 2.35

解决方案,修改 utils.py 中的处理过程,略过 m 为 None 的部分


LDCONFIG_CACHE = {}for line in text:# :fixme: this assumes libary names do not contain whitespacem = pattern.match(line)# brian add 2024-05-09if m is None:print(line)continue# brian add endpath = m.groups()[-1]if is_freebsd or is_openbsd:# Insert `.so` at the end of the lib's basename. soname# and filename may have (different) trailing versions. We# assume the `.so` in the filename to mark the end of the# lib's basename.bname = os.path.basename(path).split('.so', 1)[0]name = 'lib' + m.group(1)assert name.startswith(bname)name = bname + '.so' + name[len(bname):]else:name = m.group(1)# ldconfig may know about several versions of the same lib,# e.g. differents arch, different libc, etc. Use the first# entry.if not name in LDCONFIG_CACHE:LDCONFIG_CACHE[name] = path

添加了这个字段

        # brian add 2024-05-09if m is None:print(line)continue# brian add end

果然python2 停止维护后,还需要手动修改bug,很难忘的过程,在此记录,以做参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/57461072.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

前后端数据交互形式随手笔记

注解@RequestParam Map<String, String> params 的使用1 在Spring MVC中,使用@RequestParam Map<String, String> params可以接收前端发出的请求参数并将它们作为一个Map收集起来。这种方式非常灵活,可以处理来自前端的各种数据提交形式。以下是一些常见的前端数…

一种新的基于机器学习的示波法血压估计方法,开源、低功耗、低成本的人工智能软硬件提供者

具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能 血压的测量和预测是心脏病患者和有心脏问题的人的一个重要条件,应该保持持续的控制。在这项研究中,基于从使用袖带的个体获得的振荡波形,振荡波形分为三个周期。第一个周期是从起点到收缩压(SBP),第…

C++ 数组元素操作

数组元素的移除核心思路:创建一个新的内存空间存储移除后的数组,再将原数组delete释放,再将指针指向新数组。cout << "----------------------------- 数组元素的移除 -------------------------" << endl; //cout << deleteArrByIndex(0, arr1…

React文本溢出组件封装以及高亮提示

React文本溢出组件封装以及高亮提示Abbr 组件:使用场景:当我们需要设置支持最大行数时进行省略展示 当我们需要设置支持设置超过多少字符进行省略展示 当我们需要设置支持关键字高亮展示(有点问题,当关键字被裁剪成...之后,就无法高亮) 当我们需要支持忽略大小写高亮 当我…

会充电的CANoe-赋能新能源汽车,高效完成即插即充(PnC)智能充电功能测试

ISO 15118-2标准中描述的PnC功能,可以实现插枪即充电,识别、计费信息、充电参数都通过高级别通信在EV和EVSE之间自动交换。简化了电动汽车的充电过程,提高了用户体验,为电动汽车行业带来了更智能、更便捷的充电解决方案。然而,电动汽车和充电站之间要实现自动通信和计费,…

Nginx负载均衡、动静分离Tomcat案例实战

一、前言 1)Tomcat是一款开源的、免费的WEB软件服务器,是隶属于Apache基金会旗下的,主要是用于去发布网站代码、提供网页信息服务的。用户通过浏览器可以实现网站页面的访问。 2)Tomcat WEB软件默认可以处理静态网页(Apache、Nginx),同时也可以处理动态网页,主要是处理…