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, чтобы избежать ошибки, поскольку я описываю здесь в другом разделе, где я объясняю конкретный случай моей ситуации. Я публикую это здесь, ожидая, что это поможет любому, кто сталкивается с той же проблемой.