假设你已经安装了所有的依赖项(在 Ubuntu 上会有一堆东西sudo apt-get install libdb4.8-dev
和其他各种 -dev 包,那么这就是我构建 Python 的方式。
tar zxvf Python-2.7.1.tgz
cd Python-2.7.1
# 64 bit self-contained build in /opt
export TARG=/opt/python272
export CC="gcc -m64"
export LDFLAGS='-Wl,-rpath,\$${ORIGIN}/../lib -Wl,-rpath-link,\$${ORIGIN}/../lib -Wl,--enable-new-dtags'
./configure --prefix=$TARG --with-dbmliborder=bdb:gdbm --enable-shared --enable-ipv6
make
make install
在 make 期间不构建的唯一模块是:
_tkinter - I don't do GUI apps and would use wxWindows if I did
bsddb185 - horribly obsolete version of bdb
dl - deprecated in 2.6
imageop - deprecated in 2.6
sunaudiodev - obsolete interface to some SparcStation device I think
接下来,我收集尚未在 Python 安装目录中的任何 .so 文件并将它们复制过来:
# collect binary libraries ##REDO THIS IF YOU ADD ANY ADDITIONAL MODULES##
cd /opt/python272
find . -name '*.so' | sed 's/^/ldd -v /' >elffiles
echo "ldd -v bin/python" >>elffiles
chmod +x elffiles
./elffiles | sed 's/.*=> //;s/ .*//;/:$/d;s/^ *//' | sort -u | sed 's/.*/cp -L & lib/' >lddinfo
# mkdir lib
chmod +x lddinfo
./lddinfo
然后添加 setuptools 以进行良好的测量
#set the path
export PATH=/opt/python272/bin:$PATH
#install setuptools
./setuptools-0.6c11-py2.7.egg
此时,我可以制作一个 /opt/python272 的 tarball 并在任何 64 位 Linux 发行版上运行它,甚至是一个没有安装任何依赖项的精简版,或者具有旧的过时版本的依赖项的旧发行版。
我也pip
安装了,但由于与 virtualenv 的一些失败的斗争,我的笔记在这一点上有一个空白。基本上 virtualenv 不支持这种情况。大概我做了easy_install pip
然后:
export LD_RUN_PATH=\$${ORIGIN}/../lib
pip install cython
pip install {a whole bunch of other libraries that I expect to use}
安装完模块后,我返回并重新运行命令以收集 .so 文件,并制作一个新的 tarball。有几个包我不得不弄乱LDFLAGS
它们才能正确安装,而且我还没有做足够彻底的测试,但到目前为止它可以工作,我正在使用这个 Python 构建在机器上运行生产应用程序没有预装所有支持库。