使用zlib支持从源代码构建Python

54

在Ubuntu 12.04上从源代码构建Python 3.2.3时,zlib模块不可用。

我从python.org下载了官方的源代码分发包,并尝试使用以下命令构建和安装它。

tar xfa Python3.2.3.tar.bz2
cd Python-3.2.3
./configure --prefix=/opt/python3.2
make
sudo make install

make命令的输出包括以下内容。

Python build finished, but the necessary bits to build these modules were not found:
_curses            _curses_panel      _dbm            
_gdbm              _sqlite3           _ssl            
_tkinter           bz2                readline        
zlib                                            

在运行make install并启动解释器后,无法导入zlib模块。

我确认在我的系统上安装了zlib1g-dev软件包。

我还找到了一个类似的问题(链接),该问题建议在./configure命令中添加--with-zlib标志。然而,这会返回一个错误,指出它是未被识别的选项,没有任何效果。


我希望自己回答自己的问题并不是一件坏事。我花了几个令人沮丧的小时来解决这个问题,最终在我的答案下面链接的地方找到了解决方案,那个地方相当难找。希望把它放在这里能让其他人更容易找到。 - joshayers
1
我建议在运行configure + make从源代码构建自己的Python之前,先运行sudo apt-get build-dep python或类似命令。这可以确保你拥有所有必要的开发头文件,以供Python链接到库时使用。 - gps
11个回答

99

我在CentOS 6.3和Python 3.2.3上遇到了类似的问题。

我通过以下方法解决了这个问题:

编辑/Modules/Setup文件并取消注释该行:

zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz

切换到目录 /Modules/zlib:

./configure
make
sudo make install

然后我编译了我的Python 3.2源代码。

然后我能够测试导入zlib,一切都正常工作 :)


1
在我的电脑上,3.4.3 版本可以正常工作。 - Arthur M
1
在我的 Python3.5.1 版本上运行成功。谢谢。 - Abdurrahman Adebiyi
1
也在3.6.5上工作过。谢谢。 - Gopal
2
Python 3.7.0 中似乎没有 /Modules/zlib 目录。同时也没有 /Modules/Setup 目录,只有一个包含所提到行的 /Modules/Setup.dist 文件。我修改了文件,将其复制到 /Modules/Setup 并按照其他步骤操作,但对于 3.7.03.6.53.2.3 都没有起作用。 - ArchLinuxTux
1
/Modules/Setup will be found where you have python. ex: /opt/Python3.6.5 - sgauri
使用 CentOS 8 Linux(最终版本)和 Python 3.9.16。稍作修改后,我将以下代码添加到 Modules/Setup.local 文件中,并执行了 dnf install gcc make libffi-devel openssl-devel zlib-devel bzip2-devel xz-devel 命令安装所需的依赖包。安装后,执行 dnf history #dnf history undo 24 # 命令来删除所有开发工具库。 - BiG_NoBoDy

20

我正在使用CentOS 6.6版本,遇到zlib错误。这里提出的其他解决方法(包括在Modules/Setup中取消注释一行代码的修复方法)都对我没有用。我通过以下命令进行了修复。

yum groupinstall "Development tools"
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel

接下来按照以下步骤进行配置和安装Python:

./configure --prefix=/usr/local LDFLAGS="-Wl,-rpath /usr/local/lib"
make && make altinstall

我现在可以在 /usr/local/bin/python2.7 中无障碍地导入 zlib 了。

这些指示略有修改,取自此处的一篇文章。


18

解决方案是安装Ubuntu包dpkg-dev

sudo apt-get install dpkg-dev

原因在这里有解释。

简而言之,最近的Ubuntu版本不再将libz.so存储在标准的/usr/lib位置,而是存储在特定于平台的位置。例如,在我的系统上,它位于/usr/lib/x86_64-linux-gnu。这导致Python的构建系统无法找到它。

dpkg-dev软件包安装了dpkg-architecture可执行文件,使Python能够找到必要的库。

最初的问题是关于Python 3.2.3的。我还下载了Python 2.7.3并确认了相同的问题存在,此解决方案也适用于它。


19
dpkg-dev 是由 build-essential 安装的,后者是构建“任何东西”所必需的基本工具。因此,您应该真正执行 sudo apt-get install build-essential。;-) - Lennart Regebro
1
公正地说,这个回答已经有6年了,但在Ubuntu 18.04上,当构建Python 2.7.13时,这并不能解决zlib问题。 - Haydentech

10

如果您正在尝试使用非系统/非标准的zlib(例如从源代码构建自己的zlib),请确保将CPPFLAGS(而不是CFLAGS!)和LDFLAGS传递给./configure。例如,如果您的zlib位于/opt/zlib

./configure CPPFLAGS='-I/opt/zlib/include' LDFLAGS='-L/opt/zlib/lib'
make
sudo make install

我迷失在了寻找为什么我们的Python没有构建zlib支持的兔子洞中,并发现CPython setup.py 只查看 CPPFLAGS 而不是 CFLAGS的包含目录:

https://github.com/python/cpython/blob/master/setup.py#L562

永久链接 https://github.com/python/cpython/blob/0198f52ea2328fd932622ad2299381f617a041f2/setup.py#L562 - Winand

7

唯一帮助我安装Python 3.5.1的解决方案是使用apt-get安装zlib1g-dev(以及其他软件包,如python-setuptools和python-pip),然后从源代码重新构建Python 3.5.1。

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo apt-get install build-essential python-dev python-setuptools python-pip python-smbus
sudo apt-get install build-essential libncursesw5-dev libgdbm-dev libc6-dev
sudo apt-get install zlib1g-dev libsqlite3-dev tk-dev
sudo apt-get install libssl-dev openssl
cd ~
mkdir build
cd build
wget https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
tar -zxvf Python-3.5.1.tgz
cd Python-3.5.1
./configure
make
sudo make install

来源: https://github.com/MrYsLab/xideco/wiki/Installing-Python-3.5

据我所知,新版本的Python是包含了之前使用apt-get安装的相关软件包。因此,当你浏览新的Python-3.5.1/lib/site-packages目录时,你会发现其中包含了pip和setuptools。更重要的是,它们会被复制到你使用Python-3.5.1创建的任何虚拟环境中,并且这些虚拟环境将使用它们而不是系统默认的软件包。在安装新版本的Python时,这一点非常非常重要,否则你可能会遇到各种错误,比如:

  • zlib未安装;
  • 在虚拟环境中执行"pip install ..."命令时,会将软件包安装到系统默认的Python中,而不是虚拟环境中。

1
这个列表对我帮助很大。我还安装了libreadline-gplv2-dev和libbz2-dev来解决Python 3.7.3中的警告问题。 - Asher

4

在使用 MAC 时,我遇到了相同的错误。

我的 MAC OS 版本为:

$ uname -v
Darwin Kernel Version 13.4.0: Sun Aug 17 19:50:11 PDT 2014; root:xnu-2422.115.4~1/RELEASE_X86_64

这里使用的是Python3.4。

问题

  1. 在使用Python3.4时,zlib不可用。

    $ python3.4 get-pip.py Traceback (most recent call last): File "get-pip.py", line 20204, in main() File "get-pip.py", line 152, in main bootstrap(tmpdir=tmpdir) File "get-pip.py", line 82, in bootstrap import pip zipimport.ZipImportError: can't decompress data; zlib not available

  2. 重新构建Python失败。

    ./configure --with-zlib-dir=/usr/local/lib

... configure: WARNING: unrecognized options: --with-zlib-dir ...

解决方案

  1. 确保已安装zlib。 默认情况下,它将安装在/usr/lib中。

    ls /usr/lib/libz.*

如果未安装, a. 下载并安装 i)从zlib.net网站 或 ii)从像下面这样的git存储库

git clone https://github.com/madler/zlib.git 

或者 iii). 在Python源代码目录下的Modules/zlib中使用zlib源代码

b. 安装zlib

./configure --prefix=/usr/local
make
sudo make install 

2. 取消注释下面这行的内容:"/Module/Setup",然后保存。 "#zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz "

3. 再次从源代码重新构建Python3.4。

cd ${PYTHON_SRC_CODE_DIR}  
./configure --prefix=${PYTHON_HOME_DIR}
make
sudo make install 

4. 确认安装
请注意,gzip依赖于zlib。

nbr_repeation=100
f=open("some_file.txt","at")
for line in range(nbr_repeation): 
    print('[{}] This file will be compressed using python zlib/gzipmodule'.format(line),file=f)

f.close()
f=open("some_file.txt","rt")
import gzip
gz=gzip.open('some_file.gz', 'wt') 
for line in f : gz.write(line)

gz.close() # Like to be clean exit
f.close()  # Like a clean exit

"""confirm the creation of the compressed gzip files"""
import os
print([ (file,os.stat(file)[6],"bytes") for file in os.listdir(".") if file.startswith("some")])

1
我找到的最简单的解决方案在python.org上:
sudo apt-get build-dep python3.6

如果该软件包在您的系统中不可用,请尝试降低其次版本,直到找到一个在系统的软件包管理器中可用的软件包。
如果您看到类似于以下内容:E:您必须在源列表中放置一些“源”URI,请打开“软件和更新”,启用源代码。
我试着在博客文章中解释了细节。

1

sudo apt-get install zlib1g-dev

这是对我有效的方法。


1
sudo apt-get install build-essential python-dev

即使python-dev是为python2.7准备的,它仍会引入所有必要的依赖项。
然后你需要执行:
./configure
make
sudo make install

重新构建Python3。

0

这是我在一个没有开发库的CentOS 7机器上构建Python 3.7的方法,并将其安装到用户的~/.local目录下而无需使用sudo。已构建zlibOpenSSLreadline模块。

https://www.python.org/downloads下载Python源代码(格式为.tgz)。从https://centos.pkgs.org下载zlib-devel-1.2.7-18.el7.x86_64.rpmopenssl-devel-1.0.2k-19.el7.x86_64.rpmkrb5-devel-1.15.1-50.el7.x86_64.rpmlibcom_err-devel-1.42.9-19.el7.x86_64.rpmreadline-devel-6.2-11.el7.x86_64.rpm以获取SSL、zlib和readline模块。将所有文件放入$DIST_PATH

cd ~
DIST_PATH=<path to downloaded files>
for f in $DIST_PATH/*.rpm; do rpm2cpio $f | cpio -idmv; done
mkdir ~/usr/lib
# symlinks in ~/usr/lib64 are broken, so create new links to system libraries in ~/usr/lib and pass this folder to ./configure
for f in ~/usr/lib64/*.so; do ln -s /lib64/`readlink $f` ~/usr/lib/`basename $f`; done

tar -xzf $DIST_PATH/Python-3.7.13.tgz && cd Python-3.7.13
# That machine has devtoolset-7 with newer version GCC
scl enable devtoolset-7 bash
# curly brackets are important here, otherwise LDFLAGS is -LOME/usr/lib
./configure --enable-optimizations --prefix=$HOME/.local --with-openssl=$HOME/usr CPPFLAGS='-I${HOME}/usr/include' LDFLAGS='-L${HOME}/usr/lib'
make
# (!) altinstall is used, use python3.7 command to access newly built Python
make altinstall

rm -rf ~/usr

链接:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接