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.cfg
fileэтот сценарий может быть изменен и адаптирован для удовлетворения ваших потребностей, но вы получаете идею. И это позволяет вам запускать свою команду без торможения pip. Надеюсь, это поможет:)
если вы используете virtualenv*, это может быть хорошей идеей, чтобы дважды проверить
which pip
вы используете.если вы видите что-то вроде
/usr/local/bin/pip
вы вырвались из своего окружения. Повторная активация virtualenv исправит это:VirtualEnv:
$ source bin/activate
VirtualFish:
$ vf activate [environ]
*: Я использую virtualfish, но я предполагаю, что этот совет имеет отношение к обоим.
У меня похожая проблема. Я использую -- system флаг, чтобы избежать ошибки, как я описываю здесь на другой поток, где я объясняю конкретный случай моей ситуации. Я публикую это здесь, ожидая, что это может помочь любому, кто сталкивается с той же проблемой.