На что указывает «error: option --single-version-external-managed notformed»?

102

Кажется, я внезапно начал сталкиваться с ошибкой error: option --single-version-externally-managed not recognizedпри pip installиспользовании пакетов varions (включая PyObjCи astropy). Я никогда раньше не видел эту ошибку, но теперь она также появляется в сборках travis-ci, для которых ничего не изменилось.

Указывает ли эта ошибка на устаревший дистрибутив? Или какой-то неверно указанный вариант в setup.py? Или что-то совсем другое?

кефлавич
источник

Ответы:

85

Новое обновление:

Установите последнюю версию setuptools. Если вы все еще получаете ошибку, также установите wheel.

pip install -U setuptools
pip install -U wheel

Оригинальный ответ / дополнительные сведения:

--single-version-externally-managed - это опция, используемая для пакетов Python, указывающая модулю setuptools создание пакета Python, которым при необходимости можно легко управлять с помощью диспетчера пакетов хоста, например Yum или Apt.

Если вы видите это сообщение, возможно, у вас старая версия setuptools или Python. Попробуйте использовать Distribute, более новую версию setuptools, имеющую обратную совместимость. Эти пакеты могут ожидать, что он у вас уже есть.

https://pypi.python.org/pypi/distribute

Изменить: на этом этапе дистрибутив был объединен с основным setuptoolsпроектом. Просто установите последнюю версию setuptools. Как указано в @wynemo, вы можете использовать эту --eggопцию вместо этого, поскольку она более подходит для тех, кто выполняет ручную установку, когда вы не собираетесь создавать системный пакет для распространения.

Келкетек
источник
1
Можете ли вы добавить, какая версия появилась? Я использую setuptools 0.6, а pip не знает о более новой версии. distributeзвучит правильно, но я не могу импортировать это ...
keflavich 07
Вы этого не сделаете import distribute. Распространение - это прямая замена и имеет то же имя модуля. import setuptoolsдля этого тоже нужно.
Kelketek
Итак, что нужно сделать, это убедиться, что setuptools не переопределяет распространение, если у вас установлены оба. Вы должны установить распространение с помощью pip, а затем удалить setuptools. Я полагаю, это должно сработать.
Kelketek
17
Следует добавить: больше не использовать распространение. Распространение было снова объединено с проектом setuptools, так что теперь есть только один, setuptoolsчтобы управлять ими всеми.
Iguananaut 03
1
@johntex, этот ответ был дан более года назад, когда инструменты распространения и настройки еще не были объединены (или, если бы они были, я бы об этом не слышал). Я обновил его сейчас.
Kelketek
136

Добавить --eggвариант

pip install --egg SCons

Я использую pipверсию 1.4.1

Wynemo
источник
10
Это было единственное решение, которое действительно помогло. Последние версии pip и setuptools уже были установлены, но эта ошибка у меня есть.
Майкл
У меня была эта проблема с pyenv, и это исправило ее.
глаукон
13
Может кто-нибудь подробно объяснить, что означает эта опция и почему она работает?
kawing-chiu
4
Хотя это сработало для меня, я также получил сообщение об ошибке: «УСТАРЕНИЕ: --egg устарело и будет удалено в будущем. Этот флаг является взаимоисключающим с большими частями pip, и фактически его использование лишает возможности pip управлять процесс установки ".
natersoz
2
no such option: --eggin pip 18.1
gdw2
45

Установка wheelрешила эту проблему с недавним pip(я использовал 8.1.2):

pip install wheel
Сет Дифли
источник
Вы можете вернуться к редактированию, если хотите, без проблем. Если вы знаете точную версию pipи место wheelисправления, возможно, стоит упомянуть об этом на случай, если она снова сломается. Кроме того, ответ все равно не объясняет, что происходит.
анатолий техтоник 01
Этот плюс ответ от @sparrowt устранил мою проблему
Дэвид Поксон,
7

Попробуйте обновить инструменты настройки следующим образом:

pip install --upgrade setuptools

воробей
источник
5

У меня была эта проблема. Оказалось, что это проблема с правами доступа к файлам в моем pip-кеше.

Если вы видите сообщение в самом начале вывода, например

The directory '/home/ubuntu/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/home/ubuntu/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.

у вас может быть такая же проблема. Вы можете решить эту проблему, либо убедившись, что у вас есть надлежащие права доступа к файлам в вашем pip-кеше (что-то вроде chown -R $(whoami) /home/ubuntu/.cache/pip), либо, если вы используете UNIX, вы можете установить местоположение pip-кеша с помощью XDG_CACHE_HOMEenv var в какую-то папку, которой вы владеете.

без
источник
Удивительно, но у меня это тоже сработало (если вы используете sudoдля установки пакета, обязательно добавьте -Hфлаг)! Я действительно не вижу, какая связь между кешем и ошибкой параметра команды, но неважно.
Delgan
1

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

sudo pip3 install -U pip (для python3)

Карим
источник
0

У меня эта проблема возникает и на моем MacBook, когда я пытаюсь обновить один пакет python. Я проверяю версию pip в OS X, она слишком старая: 1.1. Я использую команду follow cmd для обновления pip до 1.5.6

easy_install -U pip

Тогда эта ошибка исправлена.

NewPtone
источник