DistutilsOptionError: необходимо указать либо home, либо prefix/exec-prefix-не оба
обычно я устанавливал пакеты python через pip.
для Google App Engine мне нужно установить пакеты в другой целевой каталог.
Я пробовал:
pip install - I flask-restful -- target ./ lib
но это не удается с:
должен предоставить либо home, либо prefix/exec-prefix -- не оба
Как я могу заставить это работать?
8 ответов:
вы используете OS X и Homebrew? Домашняя страница питонаhttps://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.md вызывает известную проблему с pip и обойти.
работал для меня.
вы можете сделать этот "пустой префикс" по умолчанию, добавив a ~/.пидистул.cfg файл со следующим содержимым:
[install] prefix=Edit: не используйте этот доморощенный рекомендуемый вариант, его нарушит нормальные операции pip.
Я считаю, что есть более простое решение этой проблемы (питон Homebrew на macOS), которое не нарушит ваши обычные операции pip.
все, что вам нужно сделать, это создать
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.
другое решение* для доморощенных пользователей просто использовать
virtualenv.конечно,мая удалите необходимость в целевом каталоге в любом случае - но даже если это не так, я нашел
--targetработает по умолчанию (как в, без создания/изменения файла конфигурации), когда в виртуальной среде.
*Я говорю решение; возможно, это просто еще одна мотивация тщательно использовать venvs...
на OSX (mac), предполагая, что папка проекта называется /var/myproject
cd /var/myproject- создайте файл с именем
setup.cfgи добавить[install] prefix=- выполнить
pip install <packagename> -t .
Я попал ошибки с другими рекомендациями вокруг
--install-option="--prefix=lib". Единственное, что я нашел, что работал с помощьюPYTHONUSERBASEКак рассказали здесь.export PYTHONUSERBASE=lib pip install -I flask-restful --userэто не совсем то же самое, что
--target, но это делает трюк для меня в любом случае.
как уже упоминалось, это известная ошибка с pip & python, установленной с homebrew.
при создании
~/.pydistutils.cfgфайл с инструкцией "пустой префикс" он исправит эту проблему, но он нарушит нормальные операции pip.пока эта ошибка не будет официально устранена, одним из вариантов будет создание собственного сценария bash, который будет обрабатывать этот случай:
#!/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этот скрипт обертывает вашу команду и:
- принимает имя и цель параметры
- проверяет, пусты ли эти параметры
- создает
~/.pydistutils.cfgфайл с инструкцией "пустой префикс" в нем- выполняет команду pip с предоставленными параметрами
- выводит
~/.pydistutils.cfgfileэтот сценарий может быть изменен и адаптирован для удовлетворения ваших потребностей, но вы получаете идею. И это позволяет вам запускать свою команду без торможения pip. Надеюсь, это поможет:)
если вы используете virtualenv*, это может быть хорошей идеей, чтобы дважды проверить
which pipвы используете.если вы видите что-то вроде
/usr/local/bin/pipвы вырвались из своего окружения. Повторная активация virtualenv исправит это:VirtualEnv:
$ source bin/activateVirtualFish:
$ vf activate [environ]*: Я использую virtualfish, но я предполагаю, что этот совет имеет отношение к обоим.
У меня похожая проблема. Я использую -- system флаг, чтобы избежать ошибки, как я описываю здесь на другой поток, где я объясняю конкретный случай моей ситуации. Я публикую это здесь, ожидая, что это может помочь любому, кто сталкивается с той же проблемой.