我有一个自定义的linux发行版,并且正在从源代码构建python 3.7.2。该版本被配置为安装到备用根目录中,将从中打包打包以进行安装。
在尚未安装python3的系统上运行时,此过程可以正常运行。但是,当我在以前具有相同软件包副本的主机上运行相同的生成过程时,请确保pip无法将pip或setuptools安装到备用安装目录中,因为它可以在系统本身上找到它们。
提取并配置软件的过程如下:
mkdir -p /data/buildspace/work/python3-x86_64
/bin/tar xf /data/sources/python3/Python-3.7.2.tgz \
-C /data/buildspace/work/python3-x86_64
( cd /data/buildspace/work/python3-x86_64/Python-3.7.2 ; \
[ -f ./configure ] && CC="gcc" CXX="g++" ./configure \
--prefix=/usr --libdir=/usr/lib
--sysconfdir=/etc --bindir=/usr/bin || echo "No './configure' script")
然后在指定了DESTDIR的情况下调用make install
:
make -C /data/buildspace/work/python3-x86_64/Python-3.7.2
install DESTDIR=/data/buildspace/work/python3-x86_64/root
最初构建时,在构建系统安装python3之前,我在构建输出/日志中看到:
if test "xupgrade" != "xno" ; then \
case upgrade in \
upgrade) ensurepip="--upgrade" ;; \
install|*) ensurepip="" ;; \
esac; \
./python -E -m ensurepip \
$ensurepip --root=/data/buildspace/work/python3-x86_64/root/ ; \
fi
Looking in links: /tmp/tmpa9_lumsc
Collecting setuptools
Collecting pip
Installing collected packages: setuptools, pip
Successfully installed pip-18.1 setuptools-40.6.2
但是,当在安装了python3的系统上构建时,我找不到任何方法可以防止它考虑/usr/lib/python3.7/site-packages中的pip。运行相同的配置将产生:
Looking in links: /tmp/tmp086yebrw
Requirement already up-to-date: setuptools in /usr/lib/python3.7/site-packages (40.6.2)
Requirement already up-to-date: pip in /usr/lib/python3.7/site-packages (18.1)
然后,我尝试了--with-ensurepip=install
,但这只是稍微改变了输出:
Looking in links: /tmp/tmpl0x88vr9
Requirement already satisfied: setuptools in /usr/lib/python3.7/site-packages (40.6.2)
Requirement already satisfied: pip in /usr/lib/python3.7/site-packages (18.1)
我不知道这是否是surepip的错误,在指定--root
的情况下运行时,它不应该考虑默认的python库目录,或者是否缺少此“安装到一个全新的空间”。
我研究了使用 venv 的想法,但是我希望生成的二进制文件在打包并安装后能够在系统的正常位置运行,所以我认为这可能是错误的方向
赞赏任何指针。谢谢。
答案 0 :(得分:0)
如果要在已安装Python现有版本的系统中构建Python,则应使用make altinstall
而不是make install
。阅读官方文档中的warning或了解有关difference between those two commands的更多信息。
make install
方法会修改一些可能会导致 的全局链接,然后使pip安装变得混乱。