嗨,我的主要目标是为许多使用旧版本 python 的项目创建一个
virtualenv
,这些项目与系统版本 (3.10.x) 是分开的。 我正在使用 PopOS 22.04,包含所有更新.
由于这个错误,我什至无法使用 pip。我也阅读了周围的内容,但我读到的所有解决方案要么输出日志文件,要么输出一些其他错误指示。而我在终端里除了
Segmentation fault (core dumped)
什么都没有。
在此之前,我尝试使用
pyenv
执行上述操作,但它有太多错误,以至于我在 20 多个小时后厌倦了它......这也是我第一次从源代码安装 anything,但我确实阅读了自述文件。
~/Downloads/
cd Python-3.5.2/
./configure
make
sudo make altinstall
cd ../../Desktop/
whereis python3.5
# outputs /usr/local/bin/python3.5
virtualenv my_venv -p /usr/local/bin/python3.5
source my_venv/bin/activate
# activates (my_venv)
python
# opens python 3.5.2 shell, not the system's 3.10.x
quit()
pip -h
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)
。
我注意到有些人说它可以持续几个小时,但这样做可以帮助发现一些问题,并修补它们或其他什么。我会等着看会发生什么,但是......
谢谢!
我在尝试使用从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
但是,这对我来说只是暂时有效,而补丁到目前为止一直是可靠的。
我知道这是一篇旧文章,但我尝试在 3.4.1 上运行的项目也遇到同样的问题,这也适用吗?