假设您已经安装了所有依赖项(在Ubuntu上,这将是一堆东西,如sudo apt-get install libdb4.8-dev
和其他各种-dev软件包),然后这就是我构建Python的方式。
tar zxvf Python-2.7.1.tgz
cd Python-2.7.1
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文件,并将它们复制过去。
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
chmod +x lddinfo
./lddinfo
然后再加上setuptools,以确保一切正常。
export PATH=/opt/python272/bin:$PATH
./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版本来运行生产应用程序,这些机器上没有预安装所有支持库。