DistutilsOptionError: должен поставлять домашний или префикс /exec -prefix - не оба
Я обычно устанавливал пакеты python через pip.
Для Google App Engine мне нужно установить пакеты в другой целевой каталог.
Я пробовал:
pip install -I flask-restful --target./lib
но сбой:
должен поставлять домашний или префикс/exec-префикс - не оба
Как я могу заставить это работать?
Ответы
Ответ 1
Используете ли вы OS X и Homebrew? Домашняя страница python Homebrew https://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.md вызывает известную проблему с пипсом и работу.
Работал для меня.
Вы можете сделать этот "пустой префикс" по умолчанию, добавив ~/.pydistutils.cfg со следующим содержимым:
[install]
prefix=
Изменить: Не используйте эту рекомендованную версию Homebrew, она нарушит нормальные операции с пунктами.
Ответ 2
Я считаю, что есть более простое решение этой проблемы (Homebrew Python на macOS), которая не нарушит ваши обычные операции с пунктами.
Все, что вам нужно сделать, это создать файл setup.cfg
в корневом каталоге вашего проекта, обычно там, где находится ваш основной файл __init__.py
или исполняемый файл py. Поэтому, если корневая папка вашего проекта: /path/to/my/project/
, создайте там файл setup.cfg
и введите магические слова внутри:
[install]
prefix=
ОК, теперь вы сможете запустить команды pip для этой папки:
pip install package -t /path/to/my/project/
Эта команда будет изящно работать только для этой папки. Просто скопируйте setup.cfg
в любые другие проекты, которые у вас могут быть. Не нужно писать .pydistutils.cfg
в своем домашнем каталоге. После того, как вы закончите установку модулей, вы можете удалить setup.cfg
.
Ответ 3
Другим решением * для пользователей Homebrew является просто virtualenv
.
Конечно, это может привести к необходимости удалить целевой каталог в любом случае - но даже если это не так, я обнаружил, что --target
работает по умолчанию (как, например, без создания/изменения файла конфигурации), когда в виртуальную среду.
* Я говорю решение; возможно, это просто еще одна мотивация для тщательного использования venvs...
Ответ 4
В OSX (mac), предполагая папку проекта, называемую /var/myproject
-
cd /var/myproject
- Создайте файл с именем
setup.cfg
и добавьте
[install]
prefix=
- Запустить
pip install <packagename> -t .
Ответ 5
Я ударил ошибки другими рекомендациями около --install-option="--prefix=lib"
. Единственное, что я нашел в работе: PYTHONUSERBASE
, как описано здесь.
export PYTHONUSERBASE=lib
pip install -I flask-restful --user
это не совсем то же самое, что и --target
, но в любом случае это делает трюк.
Ответ 6
Как уже упоминалось, это известная ошибка с пипом и питоном, установленным с доморощенным.
Если вы создаете файл ~/.pydistutils.cfg
с инструкцией "пустой префикс", он исправит эту проблему, но он нарушит нормальные операции с пирамидами.
Пока эта ошибка не будет официально разрешена, одним из вариантов было бы создать собственный bash script, который обрабатывал бы этот случай:
#!/bin/bash
name=''
target=''
while getopts 'n:t:' flag; do
case "${flag}" in
n) name="${OPTARG}" ;;
t) target="${OPTARG}" ;;
esac
done
if [ -z "$target" ];
then
echo "Target parameter must be provided"
exit 1
fi
if [ -z "$name" ];
then
echo "Name parameter must be provided"
exit 1
fi
# current workaround for homebrew bug
file=$HOME'/.pydistutils.cfg'
touch $file
/bin/cat <<EOM >$file
[install]
prefix=
EOM
# end of current workaround for homebrew bug
pip install -I $name --target $target
# current workaround for homebrew bug
rm -rf $file
# end of current workaround for homebrew bug
Этот script завершает вашу команду и:
- принимает имя и целевые параметры
- проверяет, пусты ли эти параметры.
- создает
~/.pydistutils.cfg
файл с инструкцией "пустой префикс"
- выполняет команду pip с предоставленными параметрами
- удаляет
~/.pydistutils.cfg
файл
Этот script можно изменить и адаптировать для удовлетворения ваших потребностей, но вы получите представление. И это позволяет вам запускать вашу команду без торможения. Надеюсь, это поможет:)
Ответ 7
У меня подобная проблема.
Я использую флаг - system, чтобы избежать ошибки, поскольку я описываю здесь в другом разделе, где я объясняю конкретный случай моей ситуации.
Я публикую это здесь, ожидая, что это поможет любому, кто сталкивается с той же проблемой.