2012-03-31 1 views
11

Gist: Каков наилучший способ обнаружения в setup.py, который мы вызываем pip install package?обнаружить pip в setup.py

Фон: У меня есть пакет (привязки для C-библиотеки), для которого я предоставляю яйца, которые включают в себя самую библиотеку. В моем readme/docs я отмечаю, что этот пакет «easy_install-able» на определенных платформах. При построении из источника (например, с помощью pip) сама библиотека является зависимой от сборки. Проблема в том, что я несколько регулярно путаю пользователей, которые ошибочно полагают, что pip - полная замена easy_install, и ожидают, что pip install package будет работать с системами без библиотеки или даже без компилятора, где яйцо - это то, чего они действительно хотят.

Я хотел бы обнаружить, что сборка была вызвана пипсом, поэтому я могу предоставить дружественное сообщение «pip! = Easy_install», если оно не удается из-за отсутствия библиотеки. Он не должен быть идеальным, просто поймайте наиболее распространенные случаи pip install package. При осмотре, это не кажется, что есть особенно надежный способ сделать это, и лучшее, что я придумал это:

probably_using_pip = '--single-version-externally-managed' in sys.argv 

Есть ли лучше (или, еще лучше, официальный) способ обнаружения pip от setup.py?

+0

Почему сообщение об ошибке должно быть иным, чем при запуске «setup.py install», когда библиотека отсутствует? – joeforker

+0

Когда вы запускаете 'setup.py install', вы, безусловно, строите из источника. Когда вы запускаете 'pip install', люди могут ожидать двоичные файлы, но не получать их (пользователи действительно не понимают различий между pip и easy_install). Этот вопрос больше не относится к моему конкретному случаю, потому что pip 1.5 поддерживает колеса по умолчанию. – minrk

+0

Еще один контекст: во время запроса (два года назад) мой пакет часто устанавливался на компьютерах, у которых нет компилятора, а pip не поддерживает двоичных форматов. easy_install работал отлично, но pip не смог скомпилировать. Из-за этого я хотел сообщить людям, чья 'pip install' не удалась, что easy_install может быть предпочтительнее. – minrk

ответ

-1

Возможно, вы попытаетесь использовать подпроцесс/os, чтобы попытаться запустить pip, а затем, если он не сработает, вы знаете, что нет пипа.

+0

Но если это не так, это ничего не значит. –

+3

Знание того, что pip существует, не помогает, потому что я ищу, действительно ли он используется. Кроме того, более простой проверкой присутствия pip будет «import pip». – minrk

3

__file__ в настройках дает что-то вроде /tmp/pip-DNpsLw-build/setup.py, если побежал от пипса.

from setuptools import setup 

def determineInstaller(): 
    if 'pip' in __file__: 
     print('========pip triggered build========') #add smiley for friendliness :) 
    return 'dummy description' 

setup(name='bla', 
     version='0.0', 
     description=determineInstaller(), 
    ) 
+1

Это еще одно замечательное замечание, хотя я бы хотел более точно уменьшить ложные срабатывания, например: 'using_pip = os.path.basename (os.path.dirname (__ file __)). Startswith ('pip -')'. Учитывая, что никто не дает ответ, который документирован или официально, и не уязвим для ложных срабатываний и/или изменений в частных API-интерфейсах, казалось бы, авторы pip не намерены, чтобы пакеты могли сказать, что пип используется. – minrk

+0

+1 для удобства – Cacovsky

+1

'__file__' решение похоже не работает с Py 2.7 2014-10-27, no 'pip' в' __file__'. У 'os.environ' есть ключ '_' со значением '/ run/shm/r/ven/bin/pip'. Это устанавливается через 'pip install -e. -U', поэтому, возможно, решение '__file__' работает с более типичными установками пакетов, но, возможно, ключ' _' является более общим? –

0

Считаете ли вы, что здание wheels, которое может установить?

+0

Теперь я создаю колеса. Когда я задал этот вопрос, колес не было. – minrk