DistutilsOptionError: необходимо указать либо home, либо prefix/exec-prefix-не оба


обычно я устанавливал пакеты python через pip.

для Google App Engine мне нужно установить пакеты в другой целевой каталог.

Я пробовал:

pip install - I flask-restful -- target ./ lib

но это не удается с:

должен предоставить либо home, либо prefix/exec-prefix -- не оба

Как я могу заставить это работать?

8 93

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

  1. cd /var/myproject
  2. создайте файл с именем setup.cfg и добавить [install] prefix=
  3. выполнить 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

этот скрипт обертывает вашу команду и:

  1. принимает имя и цель параметры
  2. проверяет, пусты ли эти параметры
  3. создает ~/.pydistutils.cfg файл с инструкцией "пустой префикс" в нем
  4. выполняет команду pip с предоставленными параметрами
  5. выводит ~/.pydistutils.cfg file

этот сценарий может быть изменен и адаптирован для удовлетворения ваших потребностей, но вы получаете идею. И это позволяет вам запускать свою команду без торможения pip. Надеюсь, это поможет:)

если вы используете virtualenv*, это может быть хорошей идеей, чтобы дважды проверить which pip вы используете.

если вы видите что-то вроде /usr/local/bin/pip вы вырвались из своего окружения. Повторная активация virtualenv исправит это:

VirtualEnv:$ source bin/activate

VirtualFish:$ vf activate [environ]

*: Я использую virtualfish, но я предполагаю, что этот совет имеет отношение к обоим.

У меня похожая проблема. Я использую -- system флаг, чтобы избежать ошибки, как я описываю здесь на другой поток, где я объясняю конкретный случай моей ситуации. Я публикую это здесь, ожидая, что это может помочь любому, кто сталкивается с той же проблемой.