cro*_*oss 5 python pip python-3.x
我有一个自定义的 linux 发行版,并且正在从源代码构建 python 3.7.2。构建配置为安装到备用根目录中,将从中打包以供安装。
在尚未安装 python3 的系统上运行时,此过程运行良好。但是,当我在具有相同包的先前构建副本的主机上运行相同的构建过程时,ensurepip 无法将 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")
Run Code Online (Sandbox Code Playgroud)
然后make install在指定 DESTDIR 的情况下调用:
make -C /data/buildspace/work/python3-x86_64/Python-3.7.2
install DESTDIR=/data/buildspace/work/python3-x86_64/root
Run Code Online (Sandbox Code Playgroud)
最初构建时,在构建系统安装 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
Run Code Online (Sandbox Code Playgroud)
但是,在安装了 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)
Run Code Online (Sandbox Code Playgroud)
然后,我尝试了--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)
Run Code Online (Sandbox Code Playgroud)
我不知道这是否是 ensurepip 中的错误,在--root指定的情况下运行时它不应该考虑默认的 python 库目录,或者是否有我在这个“安装到一个全新的空间”中遗漏的东西。
我查看了使用venv的想法,但我希望生成的二进制文件在打包和安装后能够在系统上的正常位置运行,所以我认为这可能是错误的方向。
感谢任何指针。谢谢。
小智 0
三年后,没有提供任何答案,并且这个错误自 2015 年以来就存在于 Ensurepip 中,所以为了子孙后代,我想我应该分享对我有用的解决方案:
请改用get-pip,并--ignore-installed在调用时传递标志get-pip.py以防止覆盖预先存在的系统安装的 pip。
$ cd <python_bin_dir>
$ curl -sSL https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ python get-pip.py --ignore-installed
Run Code Online (Sandbox Code Playgroud)