<p>假设您已经安装了所有依赖项(在Ubuntu上,这些依赖项可能是<code>sudo apt-get install libdb4.8-dev</code>和各种其他-dev包之类的东西,那么这就是我构建Python的方式。</p>
<pre><code>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
</code></pre>
<p>在生成过程中不生成的模块只有:</p>
<pre><code>_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
</code></pre>
<p>接下来,我收集Python安装目录中没有的.so文件,并将它们复制到:</p>
<pre><code># 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
</code></pre>
<p>然后添加setuptools以获得良好的度量</p>
<pre><code>#set the path
export PATH=/opt/python272/bin:$PATH
#install setuptools
./setuptools-0.6c11-py2.7.egg
</code></pre>
<p>在这一点上,我可以创建一个/opt/python272的tarball,并在任何64位Linux发行版上运行它,甚至可以在没有安装依赖项的精简版发行版上运行,也可以在具有旧的过时依赖项版本的旧发行版上运行。</p>
<p>我也安装了<code>pip</code>,但在这一点上,由于与virtualenv的一些失败的斗争,我的笔记中有一个空白。基本上,virtualenv不支持这种方案。大概是我做了<code>easy_install pip</code>,然后:</p>
<pre><code>export LD_RUN_PATH=\$${ORIGIN}/../lib
pip install cython
pip install {a whole bunch of other libraries that I expect to use}
</code></pre>
<p>安装完模块后,我返回并重新运行命令以收集.so文件,并创建一个新的tarball。有几个包需要我花点时间来正确安装它们,我还没有做足够的全面测试,但是到目前为止它仍然可以工作,我正在使用这个Python构建在没有预先安装所有支持库的机器上运行生产应用程序。</p>