Я пытался установить пакеты 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
флаги в качестве параметров командной строки. Я потратил много времени, пытаясь понять, в чем проблема. Я документирую свой ответ ниже, в надежде сэкономить какую-то другую беднягу на несколько часов бритья яка .
источник
./configure --prefix=${HOME}
"user = 1" в~/.pydistutils.cfg
. В этом случае мне нужно временно оставить комментарий «user = 1», чтобы можно было завершить процесс установки.Ответы:
Одноразовое решение:
или
Обратите внимание, что после расширения нет текста (даже пробелов)
=
.Вы не забывайте
--user
флаг.Установка нескольких пакетов:
Создайте
~/.pydistutils.cfg
(или эквивалент для вашей ОС / платформы) со следующим содержимым:Обратите внимание, что после расширения нет текста (даже пробелов)
=
.Затем запустите необходимые команды
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
. Вы должны изменить эту спецификацию, используя один из описанных выше методов.источник
Как было отмечено в комментариях, принятый ответ (от @gotgenes, предположительно имеющего гены) может привести к неожиданным последствиям.
@rogeleaderr говорит: «Обратите внимание, что сохранение этого файла в таком виде заставит Python думать, что / является вашим корневым каталогом библиотеки Python, что приведет к запутанным проблемам, если вы попытаетесь установить другие новые пакеты».
Вместо того, чтобы писать новый файл конфигурации, как рекомендует @gotgenes, лучший вариант - добавить
--prefix=
(без текста справа от знака равенства) в качестве параметра в командной строке , как висточник
Публикация, чтобы сэкономить время других, так как у меня нет доступных ответов ...
В некоторых средах использование переключателя
--target
(-t
) по-прежнему вызывает ту же ошибку. В моем тестировании на двух разновидностях Linux я столкнулся с той же проблемой при использовании--prefix=
параметра.Код:
Объяснение: Мой обходной путь, который, кажется, работает во многих средах (MacOS, Amazon Linux, Debian), - это установить для
PYTHONUSERBASE
переменной среды временное местоположение.--force-reinstall
используется для запуска локальной установки, даже если пакет уже установлен.Это приведет к компиляции / установке модуля (в зависимости от ОС и версии Python) для:
/tmp/lib/python2.7/site-packages/*
источник
Вы можете просто запустить
pip install --user .
, аргументы префикса не требуются.В любом случае это лучше, потому что по умолчанию он будет python3, если ваш пип настроен на использование Python 3. (я забыл ввести,
python3 setup.py
и он установил пакет только для 3 под 2.7)(кредит https://stackoverflow.com/a/1550235/4364036 )
источник
У меня была такая же проблема. Он был спрятан внутри с
~/.config/pip/pip.conf
помощью:Такой конфиг был создан сторонним скриптом без моего ведома.
Я предлагаю проверить файлы конфигурации pip и удалить
target=/foo/bar
параметры.источник