![](/img/trans.png)
[英]Why is pip installing different binaries for the same version of the same package?
[英]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.6
或pip3.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 ipython
和pip3.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.