2012-03-31 3 views
11

Gist: Quelle est la meilleure façon de détecter dans setup.py que nous sommes déclenchés par pip install package?détecter pip dans setup.py

Contexte: J'ai un paquet (bindings pour une bibliothèque C), pour lequel je fournis des oeufs qui incluent la bibliothèque elle-même. Dans mon readme/docs, je note que ce paquet est facile à installer sur certaines plates-formes. Lors de la construction à partir de la source (par exemple avec pip), la bibliothèque elle-même est une dépendance de construction. Le problème est que j'ai un peu régulièrement confondu les utilisateurs qui croient à tort que pip est un remplacement complet pour easy_install, et s'attendre à pip install package de travailler sur des systèmes sans la bibliothèque, ou même sans compilateur, où l'oeuf est ce qu'ils veulent vraiment.

Je voudrais détecter que la construction a été déclenchée par pip, donc je peux fournir un message amical "pip! = Easy_install" s'il échoue en raison de l'absence de la bibliothèque. Il n'a pas besoin d'être parfait, il suffit d'attraper les cas les plus courants de pip install package. Lors de l'inspection, il ne semble pas comme il y a une façon de faire particulièrement robuste, et le meilleur que je suis venu avec est:

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

est-il un moyen de mieux (ou mieux encore, officiel) pour détecter pip de setup.py?

+0

Pourquoi le message d'erreur doit-il être différent de celui exécuté lors de l'exécution de "setup.py install" lorsque la bibliothèque n'est pas présente? – joeforker

+0

Lorsque vous exécutez 'setup.py install', vous construisez certainement à partir de la source. Lorsque vous lancez 'pip install', les gens peuvent s'attendre à des binaires sans les obtenir (les utilisateurs ne comprennent vraiment pas les différences entre pip et easy_install). Cette question n'est plus pertinente dans mon cas particulier, car le pip 1.5 supporte les roues par défaut. – minrk

+0

Un peu plus de contexte: au moment de la demande (il y a deux ans), mon paquet était fréquemment installé sur des machines qui n'avaient pas de compilateur, et pip ne supportait aucun format binaire. easy_install a bien fonctionné, mais pip ne parviendrait pas à compiler. Pour cette raison, je voulais informer les personnes dont l'installation du 'pip 'a échoué que easy_install pourrait être préférable. – minrk

Répondre

-1

Pourriez-vous essayer d'utiliser subprocess/os pour essayer d'exécuter pip, puis si cela échoue, vous savez qu'il n'y a pas pip.

+0

Mais si ce n'est pas le cas, cela ne veut rien dire. –

+3

Sachant que le pip n'existe pas, parce que je cherche si c'est en cours d'utilisation. De plus, un contrôle plus facile de la présence de pip serait «import pip». – minrk

3

__file__ dans la configuration donne quelque chose comme /tmp/pip-DNpsLw-build/setup.py si couru de pip.

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

C'est une autre bonne note, bien que je veuille être plus précis pour réduire les faux positifs, par exemple: 'using_pip = os.path.basename (os.path.dirname (__ fichier __)). Startswith ('pip -')'. Étant donné que personne ne fournit de réponse documentée ou officielle, et qu'elle n'est pas vulnérable aux faux positifs et/ou aux changements dans les API privées, il semblerait que les auteurs de pip n'aient aucune intention que les paquets puissent dire que pip est utilisé. – minrk

+0

+1 pour la convivialité – Cacovsky

+1

La solution '__file__' ne semble pas fonctionner avec Py 2.7 2014-10-27, pas de 'pip' dans' __file__'. 'os.environ' a une clé '_' avec la valeur '/ run/shm/r/ven/bin/pip'. C'est l'installation via 'pip install -e. -U', alors peut-être que la solution '__file__' fonctionne avec des installations pip plus typiques, mais peut-être que la touche' _' est plus générale? –

0

Avez-vous considéré le bâtiment wheels que la pip pip peut installer?

+0

Je construis des roues maintenant. Quand j'ai posé cette question, les roues n'existaient pas. – minrk

Questions connexes