在编译Python源代码之前,我应该安装哪些软件包/库?

偶尔我需要安装新的Ubuntu(我同时用于桌面和服务器),而且我总是忘记在编译之前应该安装的一些库,这意味着我必须重新编译,真是令人讨厌。

所以现在我想要制作一个在编译Python之前需要安装的所有库包的完整列表(最好还有它们的可选性)。

这是我通过下面的帮助和查看setup.py编写的列表。至少对于Ubuntu 10.04和11.04,它是完整的:

build-essential (obviously)
libz-dev        (also pretty common and essential)
libreadline-dev (or the Python prompt is crap)
libncursesw5-dev
libssl-dev
libgdbm-dev
libsqlite3-dev
libbz2-dev

对于Python 3.2及更高版本:
liblzma-dev

更多选择:
tk-dev
libdb-dev

Ubuntu没有v1.8.5版本的Berkeley数据库和Sun音频硬件的软件包,因此在Ubuntu上仍然不会构建bsddb185sunaudiodev模块,但是所有其他模块都使用了上述安装的软件包。

更新

在Ubuntu 14.04中,Python 2.6和2.7等版本需要更多补丁。我建议使用pyenv代替。它包含一个名为python-build的脚本(位于plugins/python-build/bin目录中)。您可以使用它来安装任意版本的Python,例如:

$ ./python-build 2.7.8 /opt/python27

其中2.7.8是版本号,/opt/python27是安装路径。Pyenv将下载Python版本,应用必要的补丁并为您执行configure; make; make install

更新结束

在Ubuntu 11.04及更高版本中,Python 2.5和Python 2.6还需要设置LDFLAGS以处理新的多架构布局:

export LDFLAGS="-L/usr/lib/$(dpkg-architecture -qDEB_HOST_MULTIARCH)"

对于Python 2.6、2.7和3.0版本,在运行./configure脚本之后,运行make之前,您还需要显式启用SSL。在Modules/Setup文件中,有如下几行代码:
#SSL=/usr/local/ssl
#_ssl _ssl.c \
#       -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
#       -L$(SSL)/lib -lssl -lcrypto

取消注释这些行,并将SSL变量更改为/usr
SSL=/usr
_ssl _ssl.c \
       -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
       -L$(SSL)/lib -lssl -lcrypto

Python 2.6和3.0也需要修改Modules/_ssl.c以与OpenSSL 1.0一起使用,而Ubuntu 11.10中使用的就是这个版本。在大约300行左右,你会找到以下内容:
    else if (proto_version == PY_SSL_VERSION_SSL3)
        self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */
    else if (proto_version == PY_SSL_VERSION_SSL2)
        self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */
    else if (proto_version == PY_SSL_VERSION_SSL23)
        self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */

将其改为:
    else if (proto_version == PY_SSL_VERSION_SSL3)
        self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */
#ifndef OPENSSL_NO_SSL2
    else if (proto_version == PY_SSL_VERSION_SSL2)
        self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */
#endif
    else if (proto_version == PY_SSL_VERSION_SSL23)
        self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */

这将禁用SSL_v2支持,显然在OpenSSL1.0中已经消失了。
Python 2.4(是的,我仍然有一些需要2.4版本的旧项目)需要这个补丁来设置setup.py:
--- setup.py    2006-10-08 19:41:25.000000000 +0200
+++ setup.py        2012-05-08 14:02:14.325174357 +0200
@@ -269,6 +269,7 @@
         lib_dirs = self.compiler.library_dirs + [
             '/lib64', '/usr/lib64',
             '/lib', '/usr/lib',
+           '/usr/lib/x86_64-linux-gnu'
             ]
         inc_dirs = self.compiler.include_dirs + ['/usr/include']
         exts = []
@@ -496,7 +497,8 @@
                 ssl_incs += krb5_h
         ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
                                      ['/usr/local/ssl/lib',
-                                      '/usr/contrib/ssl/lib/'
+                                      '/usr/contrib/ssl/lib/',
+                                     'x86_64-linux-gnu'
                                      ] )

         if (ssl_incs is not None and

需要使用以下方式进行编译:
env CPPFLAGS="-I/usr/lib/x86_64-linux-gnu" LDFLAGS="-L/usr/include/x86_64-linux-gnu"  ./configure --prefix=/opt/python2.4
4个回答

还有几个。通常,配置应该会提醒您是否缺少任何内容,其中一些是可选的。这是我的列表:

build-essential
libncursesw5-dev
libreadline-gplv2-dev
libssl-dev
libgdbm-dev
libc6-dev
libsqlite3-dev
libbz2-dev
libffi-dev

1谢谢,已更新。配置确实会提醒你,但有时候它会匆匆忽过,而且有时候也不明显该安装哪个软件包。 - Lennart Regebro
很高兴被认可为唯一一个真正回答问题的人。:) 下次我需要安装Ubuntu时,我会尽量记得在这个问题上补充。:) - Lennart Regebro
1对于Ubuntu 12.04,您需要将libreadline5-dev更改为libreadline-dev - Ehtesh Choudhury
谢谢你的回答。你的回答中说“不需要安装tk dev库”,但是列表中包括了“tk-dev”。我是不是太傻了? - Jonathan Hartley
3更近期,还应添加libbz2-dev和liblzma-dev。 - Apalala
216.10已将libreadline5-dev替换为libreadline-gplv2-dev - jmunsch
@jmunsch 在Ubuntu 16.04上也是这种情况。 - sethmlarson
但是如果我尝试安装libreadline-dev,它又试图继续安装libncurses5libncursesw5,这些意大利面般的依赖关系是怎么回事? - davidtgq

你应该能够使用apt-get中的build-dep选项安装Python的所有构建依赖。 sudo apt-get build-dep python
    build-dep
       build-dep causes apt-get to install/remove packages in an attempt
       to satisfy the build dependencies for a source package.

1这很有趣。但它安装了许多明显不是必需的东西(libsgmls-perl!?),而没有安装libz-dev和libreadline-dev(请参见上文)。 - Lennart Regebro
当你使用apt-get source python时,这非常有用。 - Stefano Palazzo
1对我来说,这也意味着省略了openssl,这意味着在构建Python之后,我无法安装setuptools,因为它的安装程序通过https下载。 - Jonathan Hartley
这似乎也是官方文档推荐的做法:https://docs.python.org/devguide/setup.html - hwjp
1为了更精确,您可以使用命令 sudo apt-get build-dep python3.x(根据需要替换3和x为您喜欢的版本 - 尽管有时候像我这样的情况下3.6还不可用,所以我使用了3.5)。 - JxAxMxIxN

如果你想使用Google App Engine SDK:
- opensll - libssl-dev build-essential libsqlite3-dev zlib1g zlib1g-dev
PIL 1.1.7
:)

你不需要PIL来编译Python。 :) - Lennart Regebro

要运行某些类型的测试,您将需要 python-profiler