前言


最近有个需求,需要在 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 run
run_build(pyi_config, spec_file, **vars(args))
File "/usr/local/lib/python2.7/dist-packages/PyInstaller/__main__.py", line 65, in run_build
PyInstaller.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 main
build(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 build
exec(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 assemble
self._check_python_library(self.binaries)
File "/usr/local/lib/python2.7/dist-packages/PyInstaller/building/build_main.py", line 568, in _check_python_library
python_lib = bindepend.get_python_library_path()
File "/usr/local/lib/python2.7/dist-packages/PyInstaller/depend/bindepend.py", line 915, in get_python_library_path
python_libname = findLibrary(name)
File "/usr/local/lib/python2.7/dist-packages/PyInstaller/depend/bindepend.py", line 775, in findLibrary
utils.load_ldconfig_cache()
File "/usr/local/lib/python2.7/dist-packages/PyInstaller/depend/utils.py", line 400, in load_ldconfig_cache
path = 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 = {}
return text = text.strip().splitlines()[splitlines_count:] LDCONFIG_CACHE = {}
for line in text:
# :fixme: this assumes libary names do not contain whitespace
m = 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 whitespace
m = pattern.match(line) # brian add 2024-05-09
if m is None:
print(line)
continue
# brian add end 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

添加了这个字段

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

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

ubuntu22 python2 pyinstaller 打包报错:'NoneType' object has no attribute 'groups'的更多相关文章

  1. 在Python中使用moviepy进行视频剪辑时输出文件报错 ‘NoneType‘ object has no attribute ‘stdout‘问题

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 movipy输出文件时报错 'NoneType' ...

  2. Python PyInstaller 打包报错:AttributeError: 'str' object has no attribute 'items'

    pyinstaller打包时报错:AttributeError: 'str' object has no attribute 'items' 网上查询,可能是setuptools比较老: 更新一下 p ...

  3. python打包--pyinstaller打包报错

    先来一段报错信息  目前打包主要涉及socket模块出现的报错 missing module named resource - imported by posix, C:\Users\Administ ...

  4. 完美解决pyinstaller 打包报错找不到依赖pypiwin32 或pywin32-ctypes的错误

    报错信息 最近闲来无事,用python的tkinter库开发了一款带日程提醒的万年历桌面程序.在程序开发结束开始打包时,却发现一直报错 PyInstaller cannot check for ass ...

  5. python报错Nonetype object is not iterable

    https://www.cnblogs.com/zhaijiahui/p/8391701.html 参考链接:http://blog.csdn.net/dataspark/article/detail ...

  6. 【.NET调用Python脚本】C#调用python requests类库报错 'module' object has no attribute '_getframe' - IronPython 2.7

    最近在开发微信公众号,有一个自定义消息回复的需求 比如用户:麻烦帮我查询一下北京的天气? 系统回复:北京天气,晴,-℃... 这时候需要根据关键字[北京][天气],分词匹配需要执行的操作,然后去调用天 ...

  7. pyinstaller打包报错:AttributeError: 'str' object has no attribute 'items'

    导致原因和python多数奇奇怪怪的问题一样,依赖包的版本问题. 解决办法: 对setuptools这个包进行升级,链接在这里 https://pypi.org/project/setuptools/ ...

  8. pyinstaller打包报错: RecursionError: maximum recursion depth exceeded 已经解决

    看上去似乎是某个库自己递归遍历超过了python的栈高度限制 搜索了一番,很快找到了解决办法: https://stackoverflow.com/questions/38977929/pyinsta ...

  9. 报错 'dict' object has no attribute 'has_key'

    has_key方法在python2中是可以使用的,在python3中删除了. 比如: if dict.has_key(word): 改为: if word in dict:

  10. 'NoneType' object has no attribute '__getitem__'

    报错 'NoneType' object has no attribute '__getitem__' 你 result 返回的是 None ,所以 result [0] 取不了值

随机推荐

  1. PLC输出指令频率F计算

    本文章为学习记录,水平有限,望各路大佬们轻喷!!!    转载请注明出处!!!

  2. grads读取nc格式文件

    一.通常: 1.grads读取grd和ctl:open  ****.ctl 2.执行gs脚本:run   ****.gs d命令,display展示数据,常用来显示变量,比如rh,rain等 q命令, ...

  3. 助力抗疫 Splashtop 远程控制软件限时免费

    近期国内疫情又有抬头趋势,给我们的工作.生活带来诸多不便.面对疫情,居家办公是一个兼顾安全健康和保持生产力的好办法.据了解,很多广州的企业现在已经在关注或开始部署远程办公方案. 为了帮助疫情中高风险地 ...

  4. 2022年官网下安装ActiveMQ最全版与官网查阅方法

    目录 一.环境整合 构建工具(参考工具部署方式) 二.下载安装 1.百度搜索ActiveMQ,双击进入.或访问官网https://activemq.apache.org/ 2.进入下载界面,两种方式, ...

  5. vue-element-admin 运行踩坑笔记

      npm WARN deprecated svgo@1.3.2: This SVGO version is no longer supported. Upgrade to v2.x.x. npm E ...

  6. Docker批量删除容器/镜像

    1.删除所有的容器 docker rm `docker ps -a -q` 2.删除所有的镜像 docker rmi `docker images -q` 提示: -q参数:只显示容器ID

  7. .Net6 MiNiApi +EFCore6.0高B格操作的WebApi

    编辑器的选择项目运行雏形EFCore6.0的使用实体创建![在这里插入图片描述](https://img-blog.csdnimg.cn/abe224cea341434c9299e9643dbcd9e ...

  8. springboot~封装依赖引用包jar还是pom,哪种更规范

    将多个第三方包封装成一个项目后,如果你的目的是让其他开发人员可以直接引用这些依赖,一般来说有两种常见的方式: 打成JAR包:将封装好的项目编译打包成JAR文件,其他开发人员可以将这个JAR文件添加到他 ...

  9. Qt-FFmpeg开发-实现录屏功能(10)

    音视频/FFmpeg #Qt Qt-FFmpeg开发-实现录屏功能 目录 音视频/FFmpeg #Qt Qt-FFmpeg开发-实现录屏功能 1.概述 2.实现效果 3.FFmpeg录屏代码流程️‍️ ...

  10. linux ssh key 登录

    vim /etc/ssh/sshd_config #禁用root账户登录,非必要,但为了安全性,请配置 PermitRootLogin no # 是否让 sshd 去检查用户家目录或相关档案的权限数据 ...