20.04 中的 Python 3.8.x 问题

20.04 中的 Python 3.8.x 问题

我已经开始恢复大约 1.5 周前的 MicroSD 备份映像,但在将其写入全新的 SanDisk Micro SD 卡后,ext4 文件系统在启动时出现大量 inode 错误,操作系统中的所有内容或多或少都完全损坏了,并且fsck基本上给出了文件系统级别损坏的疯狂列表。这是一张全新的 Sandisk Micro SD 卡,但显然在备份过程中,数据损坏从后门溜了进来。

我在 Raspberry Pi 4B 上运行 Ubuntu 20.04,这意味着它在 arm64 架构上运行,因此建议直接从 kernel.org 下载 .deb 包,或者安装 iepython3-minimal不起作用,因为没有适用于 ARM64 的任何安装候选项。

  • 解决方案指向的 .deb 和其他安装包对于 arm64 架构来说根本不存在。

  • 还有很多过时或彻头彻尾糟糕的建议——此外,手册或 Ubuntu 用户社区(Raspberry Pi 上的启动 CD?)中描述的系统还原方法均不适用于 Raspberry Pi 4B 上的 20.04,至少目前还不适用。

我的安装仍然进展不顺,但无论我怎么尝试,apt/dpkg 更新系统仍然基本无法使用。我尝试下载 .deb 软件包并单独安装,但没有成功。

目前,Py3compile 和 Pyclean 都找不到,而这两个是 dpkg/apt 无法正常工作的主要原因,因此这个答案不起作用。

$ sudo apt install python3-all
Reading package lists... Done
Building dependency tree
Reading state information... Done
python3-all is already the newest version (3.8.2-0ubuntu2).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
4 not fully installed or removed.
Need to get 0 B/129 kB of archives.
After this operation, 0 B of additional disk space will be used.
Do you want to continue? [Y/n] y
Setting up pychess (0.12.2-1build1) ...
/var/lib/dpkg/info/pychess.postinst: 6: pycompile: not found
dpkg: error processing package pychess (--configure):
 installed pychess package post-installation script subprocess returned error ex                                   it status 127
dpkg: error processing package python-pkg-resources (--configure):
 package is in a very bad inconsistent state; you should
 reinstall it before attempting configuration
Setting up gir1.2-dee-1.0 (1.2.7+17.10.20170616-4ubuntu6) ...
/var/lib/dpkg/info/gir1.2-dee-1.0.postinst: 6: pycompile: not found
dpkg: error processing package gir1.2-dee-1.0 (--configure):
 installed gir1.2-dee-1.0 package post-installation script subprocess returned e                                   rror exit status 127
Setting up python3-minimal (3.8.2-0ubuntu2) ...
Traceback (most recent call last):
  File "/usr/bin/py3compile", line 28, in <module>
    import struct
  File "/usr/lib/python3.8/struct.py", line 13, in <module>
    from _struct import *
ModuleNotFoundError: No module named '_struct'
dpkg: error processing package python3-minimal (--configure):
 installed python3-minimal package post-installation script subprocess returned                                    error exit status 1
No apport report written because MaxReports is reached already
                                                              Errors were encoun                                   tered while processing:
 pychess
 python-pkg-resources
 gir1.2-dee-1.0
 python3-minimal
needrestart is being skipped since dpkg has failed
E: Sub-process /usr/bin/dpkg returned an error code (1)
  • 重新安装也sudo apt install --reinstall -f python3-all无济于事。
  $ sudo apt install --reinstall -f python3-all
  Reading package lists... Done
  Building dependency tree
  Reading state information... Done
  0 upgraded, 0 newly installed, 1 reinstalled, 0 to remove and 0 not upgraded.
  4 not fully installed or removed.
  Need to get 0 B/131 kB of archives.
  After this operation, 0 B of additional disk space will be used.
  (Reading database ... 1052975 files and directories currently installed.)
  Preparing to unpack .../python3-all_3.8.2-0ubuntu2_arm64.deb ...
  Unpacking python3-all (3.8.2-0ubuntu2) over (3.8.2-0ubuntu2) ...
  Setting up pychess (0.12.2-1build1) ...
  /var/lib/dpkg/info/pychess.postinst: 6: pycompile: not found
  dpkg: error processing package pychess (--configure):
   installed pychess package post-installation script subprocess returned error exit status 127
  dpkg: error processing package python-pkg-resources (--configure):
   package is in a very bad inconsistent state; you should
   reinstall it before attempting configuration
  Setting up python3-all (3.8.2-0ubuntu2) ...
  Setting up gir1.2-dee-1.0 (1.2.7+17.10.20170616-4ubuntu6) ...
  /var/lib/dpkg/info/gir1.2-dee-1.0.postinst: 6: pycompile: not found
  dpkg: error processing package gir1.2-dee-1.0 (--configure):
   installed gir1.2-dee-1.0 package post-installation script subprocess returned error exit status 127
  Setting up python3-minimal (3.8.2-0ubuntu2) ...
  Traceback (most recent call last):
    File "/usr/bin/py3compile", line 28, in <module>
      import struct
    File "/usr/lib/python3.8/struct.py", line 13, in <module>
      from _struct import *
  ModuleNotFoundError: No module named '_struct'
  dpkg: error processing package python3-minimal (--configure):
   installed python3-minimal package post-installation script subprocess returned error exit status 1
  No apport report written because MaxReports is reached already
                                                                Errors were encountered while processing:
   pychess
   python-pkg-resources
   gir1.2-dee-1.0
   python3-minimal
  needrestart is being skipped since dpkg has failed
  E: Sub-process /usr/bin/dpkg returned an error code (1)
  • sudo dpkg --configure -asudo apt -f install,会导致相同的错误。
  • dpkg 恢复说明(例如如何重新安装 dpkg) 也不起作用,因为没有所需的文件/var/cache/apt/archives/

我尝试直接从 Ubuntu 网站获取 .deb 包,提取它们并单独安装它们。

根据我浏览过的论坛帖子,至少在过去十年中,每当 Python 出现问题时(无论是用户错误还是软件包出现问题),人们就会破坏他们的 Ubuntu 和其他基于 Debian 的系统,那么以某种方式从根本上修复 Linux 中处理 dpkg/apt 架构的方式,并将它们需要运行的 Python 模块和依赖项与操作系统的其余部分隔离开来,这样会不会更安全一些?或者,在出现这种似乎相当普遍的严重情况时,创建某种故障安全的系统恢复方法。

答案1

我回复了您的之前的帖子,但看来它被锁定导致了一些问题。

正如我在原帖中提到的,你可以手动提取相关的 .deb 文件并重建一个拼凑起来的 Python 来引导你自己。看起来https://packages.ubuntu.com/focal/python3没有列出任何适用于 arm64 的镜像,但经过一些简短的搜索,我发现https://ubuntu.pkgs.org/20.04/ubuntu-main-arm64/python3_3.8.2-0ubuntu2_arm64.deb.html它会给出所有包名称,然后指向http://ports.ubuntu.com/pool/main/p/python3.8/可供下载(此镜像包含所有 arm64 软件包)。您必须从“python3”软件包开始,然后手动深入查找所有依赖项以获取它们。看起来py3compilepy3clean都位于python3-minimal 包

其次,我自己也犯过很多错误,我说这些话是因为人们可以做无数的事情,sudo这些事情会导致系统无法运行,而且没有切实可行的保障措施。sudo rm每次都需要警告/确认吗?怎么样sudo chmod?对于每篇关于有人因 Python 问题破坏系统的帖子,我可能都能指出许多人对权限做了一些不好的事情或删除了错误的文件。

答案2

我将引用我的经验——如果你尝试升级 Python来自源头在你的系统中,你将火炬您的系统将无法修复。在这种情况下,最快、最简单的解决方案是重新安装系统或者从已知良好的备份映像恢复,不要尝试从源代码升级 Python。

“重新安装”答案适用于全部操作系统版本,而不仅仅是 ISO 安装。

从“备份映像”恢复系统 Python 会很麻烦,因此您不妨从备份中进行完整的系统恢复。或者从头开始重新安装。


至于获取更新的 Python 以满足你自己的需要,你可能需要考虑使用派环境这是一个项目/工具,它允许您在用户空间中安装多个 Python 版本,而不会影响您的系统 Python,因此不会破坏您的系统 Python。因为在许多情况下,更新系统级 Python 会导致您的系统崩溃。

答案3

是的,感谢 @Brian Turek ,我的系统又可以正常运行了!我通过 SSH 连接到我的机器并从他指出的链接获取必要的 .deb 文件,从而使它正常运行(http://ports.ubuntu.com/pool/main/p/python3.8/) 和wget

首先必须安装(sudo dpkg -i)该libpython3.8-stdlib_3.8.5-2_arm64.deb包,然后安装该python3.8-minimal_3.8.5-2_arm64.deb包,只有这样该python3.8_3.8.5-2_arm64.deb包才会安装,因为依赖关系不平衡。

对后代人的提示(如果有的话):对于 Python 设置损坏的系统,安装过程可能会有所不同;只需小心查看dpkg每个包安装过程中出现的错误消息——如果它无法安装,因为它依赖于其他依赖项的另一个版本,请从 Brian 最初链接到的存储库 URL 中查找,首先安装所需的包,如果这给你带来更多麻烦,那么你必须深入挖掘并首先安装那些损坏的依赖项以“疏通马桶中的 Python”,冲洗并重复,直到一切都解决。

尽管如此,我终于成功了,我的系统恢复正常运行,我很高兴安装了由于这个问题而挂起的所有软件包和无人值守更新。感谢 Brian Turek 的帮助!<3 你让我免去了很多年的心理治疗。

PS:所有那些认为修复一个有缺陷的 Python 系统的唯一方法就是把它全部抹掉然后从头开始的讨厌的人,“Touché!”:-D

相关内容