Как избежать установки разных версий pip в одном и том же каталоге? - PullRequest
0 голосов
/ 06 марта 2019

Я работаю в 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

Когда я устанавливаю пакеты python, используя pip3.6 или pip3.8, библиотеки устанавливаются отдельно в /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

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Да, это вполне возможно. Используйте

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
0 голосов
/ 07 марта 2019

Похоже, что проблему можно решить (по крайней мере, для ipython3), установив параметр install-scripts в разделе [install] специфичного для версии файла distutils/distutils.cfg.

ВВ данном случае, кажется, работает следующее, чтобы 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

Это можно автоматизировать, добавив следующее послешаг make install в моем скрипте get_python.sh:

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 для получения дополнительной информации одоступные варианты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...