繁体   English   中英

如何避免不同版本的pip在同一目录中安装二进制文件?

[英]How to avoid different versions of pip installing binaries in the same directory?

我在Linux上工作,并且有两个本地编译的Python 3版本。Python 3.6使用--prefix=${HOME} ,Python 3.8使用--prefix=${HOME}/python3.8

bli@naples:~$ which python3.6
/home/bli/bin/python3.6
bli@naples:~$ which python3.8
/home/bli/python3.8/bin/python3.8

相应的pip命令都在我的~/.local/bin目录中:

bli@naples:~$ which pip3.6
/home/bli/.local/bin/pip3.6
bli@naples:~$ which pip3.8
/home/bli/.local/bin/pip3.8

当我使用pip3.6pip3.8安装python软件包时,这些库分别安装在/home/bli/.local/lib/python3.6/site-packages//home/bli/.local/lib/python3.8/site-packages/

但是, 二进制文件似乎安装在相同的~/.local/bin目录中 ,这导致文件被覆盖。

例如,在pip3.8 install ipython ,将先前安装的ipython3命令替换为:

bli@naples:~$ ipython3 -c "import sys; print(sys.version)"
3.8.0a2 (default, Mar  6 2019, 14:42:50) 
[GCC 5.4.0 20160609]
bli@naples:~$ head -1 /home/bli/.local/bin/ipython3
#!/home/bli/python3.8/bin/python3.8

我可以使用pip3.6 install ipython --upgrade重新获得上一个:

bli@naples:~$ ipython3 -c "import sys; print(sys.version)"
3.6.4 (default, Feb 14 2018, 18:35:27) 
[GCC 5.4.0 20160609]
bli@naples:~$ head -1 /home/bli/.local/bin/ipython3
#!/home/bli/bin/python3.6

但是,显然,这不是很方便。 我不想每次在两个安装之间切换时都运行pip。

我希望不必在虚拟环境中工作。 我想要两个单独的python3安装。 有可能避免这种干扰吗?

如果这是相关的,我有以下~/.pydistutils.cfg文件:

bli@naples:~$ cat ~/.pydistutils.cfg
[install]
optimize=1
[build_ext]
include_dirs=${HOME}/include
library_dirs=${HOME}/lib
rpath=${HOME}/lib
user=1

我的get_python.sh脚本从源代码安装python如下:

#!/usr/bin/env bash

prog="python"
progname="Python"
# It is possible to set the version in the `${VERSION}` environment variable to override the default.
# example: `VERSION="2.7.12" get_python.sh`
if [[ ${VERSION} ]]
then
    version="${VERSION}"
else
    version="2.7.12"
fi

if [[ ${RELEASE} ]]
then
    release="${RELEASE}"
else
    release=""
fi

mkdir -p ${HOME}/src
cd ${HOME}/src
# In case it's already there, remove it
rm -rf ${progname}-${version}*
# Download it
wget --continue https://www.python.org/ftp/${prog}/${version}/${progname}-${version}${release}.tar.xz
tar -xvJf ${progname}-${version}${release}.tar.xz
(
cd ${progname}-${version}${release}
[ ${PREFIX} ] || PREFIX=${HOME}
export PYTHONPATH=${PREFIX}
./configure --enable-shared --enable-optimizations --with-ensurepip=install --prefix=${PREFIX} CFLAGS="-O3 -march=native -fomit-frame-pointer" CPPFLAGS="-I${HOME}/include" LDFLAGS="-L${PREFIX}/lib -Wl,-rpath,${PREFIX}/lib"
make
make install
)

我使用如下:

VERSION="3.6.4" get_python.sh
VERSION="3.8.0" RELEASE="a2" PREFIX="${HOME}/python3.8" get_python.sh

是的,这完全有可能。 采用

python3.6 -m pip install <whatever>

python3.8 -m pip install <whatever>

Python将负责其余的工作:例如,软件包安装在单独的lib / pythonx.y /目录中。

只要次要版本不同,就可以将整个Python安装区彼此相邻。


这适用于ipython

python3.6 -m ipython

(或python3.6 -m jupyter console

和Python 3.8类似:

# pick the one that works
python3.8 -m ipython
python3.8 -m jupyter console

似乎可以通过设置特定于版本的distutils/distutils.cfg文件的[install]节的install-scripts选项来解决该问题(至少对于ipython3 )。

在目前的情况下,为了使pip3.8在与python3.8解释器本身之一相同的目录中安装可执行文件,似乎可以使用以下方法:

bli@naples:~$ cat ~/python3.8/lib/python3.8/distutils/distutils.cfg
[install]
prefix=/home/bli/python3.8
install-scripts=/home/bli/python3.8/bin

这可以通过在我的get_python.sh脚本中的make install步骤之后添加以下内容来实现自动化:

distutils_cfg="${PREFIX}/lib/${prog}$(echo ${VERSION} | cut -d "." -f 1,2)/distutils/distutils.cfg"
echo "setting ${distutils_cfg}"
echo "[install]" >> ${distutils_cfg}
echo "prefix=${PREFIX}" >> ${distutils_cfg}
echo "install-scripts=${PREFIX}/bin" >> ${distutils_cfg}

pip3.6 install --upgrade --no-deps --force-reinstall ipythonpip3.8 install --upgrade --force-reinstall ipython ,我有以下单独的可执行文件:

bli@naples:~$ head -1 .local/bin/ipython3 
#!/home/bli/bin/python3.6
bli@naples:~$ head -1 python3.8/bin/ipython3 
#!/home/bli/python3.8/bin/python3.8

我怀疑将install-lib选项也设置为${PREFIX}/lib可能会更干净,以便使用与在make install步骤中创建的目录相同的目录。

有关可用选项的更多详细信息,请参见https://bouktin.blogspot.com/2012/04/configure-pydistutilscfg-python.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM