Объединить --user с ошибкой --prefix с установкой setup.py - PullRequest
89 голосов
/ 21 декабря 2010

Я пытался установить пакеты Python для системы, к которой недавно получил доступ.Я пытался воспользоваться сравнительно новым Python-каталогом для пользовательских пакетов сайта и новой опцией --user.(Параметр в настоящее время недокументирован , однако он существует для Python 2.6+; справку можно получить, запустив python setup.py install --help.)

Когда я попытался запустить

python setup.py install --user

в любом пакете, который я скачал, я всегда получал следующую ошибку:

error: can't combine user with with prefix/exec_prefix/home or install_(plat)base

Ошибка очень сбивала с толку, потому что, как вы можете видеть, я не предоставлял --prefix, --exec-prefix,--install-base или --install-platbase помечаются как параметры командной строки.Я потратил много времени, пытаясь выяснить, в чем проблема.Я документирую свой ответ ниже, в надежде избавить какую-то другую бедную душу от нескольких часов бритья яков .

Ответы [ 3 ]

141 голосов
/ 21 декабря 2010

Одноразовое решение:

pip install --user --install-option="--prefix=" <package_name>

или

python setup.py install --user --prefix=

Обратите внимание, что после =.

Do нет текста (даже пробела). not забудьте флаг --user.

Установка нескольких пакетов:

Создайте ~/.pydistutils.cfg (или эквивалент для вашей ОС / платформы) со следующим содержимым:

[install]
prefix=

Обратите внимание, что после =.

нет текста (даже пробела). Затем выполните необходимые команды pip install --user или python setup.py install --user. не забудьте флаг --user.

Наконец, удалите или переименуйте этот файл.Если оставить этот файл настоящим, это вызовет проблемы при установке пакетов Python для всей системы (т. Е. Без --user), поскольку этот пользователь с этим ~/.pydistutils.cfg.

Причина этой проблемы

Появляетсяпроблема с OpenSUSE и RedHat, которая привела к ошибке в virtualenv на этих платформах.

Ошибка связана с файлом конфигурации системного уровня distutils (в моем случае /usr/lib64/python2.6/distutils/distutils.cfg), где это было

[install]
prefix=/usr/local

По сути, это эквивалентно тому, чтобы всегда запускать команду установки как install --prefix=/usr/local.Вы должны переопределить эту спецификацию, используя один из методов выше.

4 голосов
/ 05 мая 2015

Как отмечалось в комментариях, принятый ответ (@gotgenes, у которого, предположительно, есть гены) может привести к неожиданным последствиям.

@ rogeleaderr говорит: «Обратите внимание, что сохранение этого файла заставит Python думать, что / является вашим корневым каталогом библиотеки python, что приводит к путанице при установке других новых пакетов».

Вместо того, чтобы писать новый файл конфигурации, как рекомендует @gotgenes, лучше добавить --prefix= (без текста справа от знака равенства) в качестве опции в командной строке как в

$ python setup.py install --user --prefix=
3 голосов
/ 10 мая 2018

Публикация, чтобы сэкономить время других, так как у меня не работали доступные ответы ...

В некоторых средах использование переключателя --target (-t) по-прежнему приводит к той же ошибке.При тестировании двух версий linux я столкнулся с той же проблемой при использовании параметра --prefix=.

Код:

PYTHONUSERBASE=/tmp/ pip install --user --force-reinstall $PACKAGE

Объяснение: Мой обходной путь, который, похоже, работает во многихСреды (MacOS, Amazon Linux, Debian) устанавливают переменную среды PYTHONUSERBASE во временную папку.--force-reinstall используется для запуска локальной установки, даже если пакет уже установлен.

Это приведет к тому, что модуль будет скомпилирован / установлен (в зависимости от ОС и версии Python) для: /tmp/lib/python2.7/site-packages/*

...