从源代码安装 python3.5 后如何修复 virtualenv 的 python pip 分段错误(核心转储)响应

问题描述 投票:0回答:2

背景

嗨,我的主要目标是为许多使用旧版本 python 的项目创建一个

virtualenv
,这些项目与系统版本 (3.10.x) 是分开的。 我正在使用 PopOS 22.04,包含所有更新.

由于这个错误,我什至无法使用 pip。我也阅读了周围的内容,但我读到的所有解决方案要么输出日志文件,要么输出一些其他错误指示。而我在终端里除了

Segmentation fault (core dumped)
什么都没有。

在此之前,我尝试使用

pyenv
执行上述操作,但它有太多错误,以至于我在 20 多个小时后厌倦了它......这也是我第一次从源代码安装 anything,但我确实阅读了自述文件。

具体步骤如下

  1. 我从https://www.python.org/downloads/release/python-352/
  2. 下载并安装了python 3.5.2
  3. ~/Downloads/
  4. 中解压文件夹
  5. cd Python-3.5.2/
  6. ./configure
  7. make
  8. sudo make altinstall
  9. cd ../../Desktop/
  10. whereis python3.5
    # outputs /usr/local/bin/python3.5
  11. virtualenv my_venv -p /usr/local/bin/python3.5
  12. source my_venv/bin/activate
    # activates (my_venv)
  13. python
    # opens python 3.5.2 shell, not the system's 3.10.x
  14. quit()
  15. pip -h
  16. 回应只是:
    Segmentation fault (core dumped)
    ...就是这样。没有任何迹象表明日志文件可以追溯到它,什么也没有。尝试安装任何东西都会给出相同的响应。我什至跑了
    sudo apt install python3-pip
    ,并得到了以下答案:
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
python3-pip is already the newest version (22.0.2+dfsg-1).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

我也尝试过...

我也使用 python3.7.5 尝试了上述操作,但这次我在安装之前运行了

make test

当前在终端中显示:

running: test_faulthandler (1 hour 6 min)

我注意到有些人说它可以持续几个小时,但这样做可以帮助发现一些问题,并修补它们或其他什么。我会等着看会发生什么,但是......

有人有这方面的经验/知道该怎么做吗???

谢谢!

python python-3.x python-2.7 pip apt
2个回答
2
投票

我在尝试使用从Arch Linux上的

source
编译的Python 3.6.15通过pip安装软件包时遇到了类似的问题。例如,无论要安装哪个软件包,以下步骤都会导致打印
Segmentation fault (core dumped)
,但不提供更多详细信息:

$ <path-to-python-install>/bin/python3.6 -m venv test-venv
$ source test-venv/bin/activate
(test-venv) $ pip install <some-package>

Segmentation fault (core dumped)

解决方案

解决方案涉及应用此补丁,最初由Benjamin Peterson发布。该补丁修改了对象分配代码以使用 16 字节对齐,而不是由

pymalloc
分配的 8 字节,后者会导致分段错误。我相信这个问题在 Python 版本 >=3.7 中已得到解决。

应用补丁并从源代码编译

在终端中依次输入以下命令,下载源代码、解压、应用补丁、配置构建、构建 Python 并清理:

cd ~
mkdir py36
mkdir py36/tempfiles
cd py36/tempfiles
curl https://www.python.org/ftp/python/3.6.15/Python-3.6.15.tar.xz --output Python-3.6.15.tar.xz
tar -xJvf Python-3.6.15.tar.xz
cd Python-3.6.15
vim alignment.patch  # Use your preferred text editor
# Paste the contents of the patch, save and quit
patch -p0 < alignment.patch
cd ..
Python-3.6.15/configure --prefix=/home/<username>/py36 --enable-optimizations --with-lto
make
make install
cd ..
rm -rf tempfiles

应用了补丁的 Python 3.6.15 版本现在可以在

~/py36
中使用。测试
pip
包管理器是否按预期工作:

$ ~/py36/bin/python3.6 -m venv ~/test-venv
$ source ~/test-venv/bin/activate
(test-venv) $ pip install <some-package>

如果您在安装某些软件包时遇到一些问题,您可能需要升级

pip
setuptools

pip install --upgrade pip
pip install --upgrade setuptools

伪解

另一个暂时有效的解决方案是注释掉

pip
文件中的以下行(如建议补丁的同一 GitHub 问题 中所述,其中引用了 Johackim 的 这篇法国文章):

sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])

要查找虚拟环境使用的

pip
文件的位置,请在虚拟环境中运行
which pip
命令,例如:

(test-venv) $ which pip

但是,这对我来说只是暂时有效,而补丁到目前为止一直是可靠的。


-1
投票

我知道这是一篇旧文章,但我尝试在 3.4.1 上运行的项目也遇到同样的问题,这也适用吗?

© www.soinside.com 2019 - 2024. All rights reserved.