Объедините --user с ошибкой --prefix с установкой setup.py

103

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

gotgenes
источник
2
Я получил ту же ошибку при попытке установить python 3.6 из исходного кода с ./configure --prefix=${HOME}"user = 1" в ~/.pydistutils.cfg. В этом случае мне нужно временно оставить комментарий «user = 1», чтобы можно было завершить процесс установки.
bli
bli дал хороший намек. Мне было интересно, откуда взялась опция --user, даже если я ее не использовал. pip install --prefix / home / myhomedir. У меня нет файла ~ / .pydistutils.cfg, но я все еще ищу, где установлена ​​опция --user.
Кемин Чжоу
Выясните источник проблемы. Это специфично для Debian. После добавления опции --system проблема исчезла.
Кемин Чжоу

Ответы:

161

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

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

или

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

Обратите внимание, что после расширения нет текста (даже пробелов) =.

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

gotgenes
источник
1
Большое спасибо. Пустой префикс устранил мою проблему: pip 1.1 openSuSE 11.4.
guettli
6
Вы также можете передать пустой --prefix = в setup.py в командной строке, чтобы переопределить значение в общесистемном distutils.cfg
Tuxdude 08
2
Вот Это Да! У меня это тоже сработало. Я получил ту же ошибку при попытке установить Powerline. powerline.readthedocs.org/en/latest/installation/…
A-Dubb
4
Если подумать, это вызовет ГЛАВНЫЕ проблемы. НЕ храните этот файл. Обратитесь к врачу-пивовару для получения дополнительной информации (при условии, что вы используете домашнее пиво в Mac OS X).
A-Dubb
1
Обратите внимание, что сохранение этого файла в таком виде заставит Python думать, что / является вашим корневым каталогом библиотеки python, что приведет к запутанным проблемам, если вы попытаетесь установить другие новые пакеты.
rogueleaderr
6

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

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

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

$ python setup.py install --user --prefix=
dbliss
источник
5

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

В некоторых средах использование переключателя --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/*

EE1213
источник
0

Вы можете просто запустить pip install --user ., аргументы префикса не требуются.

В любом случае это лучше, потому что по умолчанию он будет python3, если ваш пип настроен на использование Python 3. (я забыл ввести, python3 setup.pyи он установил пакет только для 3 под 2.7)

(кредит https://stackoverflow.com/a/1550235/4364036 )

wesinat0r
источник
0

У меня была такая же проблема. Он был спрятан внутри с ~/.config/pip/pip.confпомощью:

[global]
target=/foo/bar

Такой конфиг был создан сторонним скриптом без моего ведома.

Я предлагаю проверить файлы конфигурации pip и удалить target=/foo/barпараметры.

сэр _finley
источник