Поєднайте --user з - помилкою виправлення з установкою 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прапори в якості параметрів командного рядка. Я витрачав багато часу, намагаючись зрозуміти, в чому проблема. Я задокументую свою відповідь нижче, сподіваючись пощадити якусь іншу бідну душу на кілька годин як голити .


2
Я отримав таку ж помилку при спробі встановити python 3.6 з джерела ./configure --prefix=${HOME}, маючи "user = 1" ~/.pydistutils.cfg. У такому випадку мені потрібно тимчасово прокоментувати "user = 1", щоб процес встановлення міг завершитися.
блі

блі дав добрий натяк. Мені було цікаво, звідки береться варіант --user, я навіть не використовував цей варіант. pip install --prefix / home / myhomedir. У мене немає файлу ~ / .pydistutils.cfg, я все ще шукаю, де встановлено параметр --user.
Kemin Zhou

З’ясуйте джерело проблеми. Це специфічно для Debian. Після додавання --системної опції для вирішення проблеми відійшла.
Кемін Чжоу

Відповіді:


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 як install --prefix=/usr/local. Ви повинні перекрити цю специфікацію, використовуючи один із способів, описаних вище.


1
Велике спасибі. Порожній префікс вирішив мою проблему: pip 1.1 openSuSE 11.4.
гуетлі

6
Ви також можете передати порожній --prefix = to setup.py в командному рядку, щоб змінити значення в загальносистемному distutils.cfg
Tuxdude

2
Оце Так! Це працювало і для мене. Я отримав таку ж помилку при спробі встановити Powerline. powerline.readthedocs.org/en/latest/installation / ...
А-Dubb

4
По-друге, це зробить великі проблеми. НЕ тримайте цей файл навколо. Щоб отримати додаткову інформацію, зверніться до лікаря-заварювальника (якщо ви користуєтеся домашньою мовою на Mac OS X).
A-Dubb

1
Зауважте, що зберігання цього файлу таким чином змусить Python думати, що / це ваш кореневий каталог бібліотеки python, що призведе до заплутаних проблем, якщо ви спробуєте встановити інші нові пакети.
rogueleaderr

6

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

@rogeleaderr каже: "Зауважте, що зберігання такого файлу, як цей, змусить Python думати, що / це ваш каталог кореневої бібліотеки python, що призведе до заплутаних проблем, якщо ви спробуєте встановити інші нові пакети".

Замість того, щоб написати новий конфігураційний файл, як рекомендує @gotgenes, кращим варіантом є додавання --prefix= (без тексту праворуч від знака рівності) як параметр у командному рядку , як у

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

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/*


0

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

Це все одно краще, тому що це буде типово python3, якщо ваш pip налаштований на використання Python 3. (я забув увійти, python3 setup.pyі він встановив 3-єдиний пакет під 2.7)

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


0

У мене була така ж проблема. Це було сховано всередині ~/.config/pip/pip.conf:

[global]
target=/foo/bar

Таку конфігурацію створив сторонній сценарій без мого відома.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.