2012-03-31 12 views
11

में पाइप का पता लगाएं: setup.py में पता लगाने का सबसे अच्छा तरीका क्या है कि हमें pip install package द्वारा ट्रिगर किया जा रहा है?setup.py

पृष्ठभूमि: मेरे पास एक पैकेज है (सी-लाइब्रेरी के लिए बाइंडिंग), जिसके लिए मैं अंडे प्रदान करता हूं जिसमें लाइब्रेरी स्वयं शामिल है। मेरे रीडेमे/डॉक्स में मुझे लगता है कि यह पैकेज कुछ प्लेटफॉर्म पर 'easy_install-able' है। स्रोत से निर्माण करते समय (उदाहरण के लिए पीआईपी के साथ), पुस्तकालय स्वयं एक निर्माण निर्भरता है। समस्या यह है कि मैंने कुछ हद तक नियमित रूप से उन उपयोगकर्ताओं को भ्रमित कर दिया है जो गलती से मानते हैं कि पीआईपी आसान-स्थापना के लिए एक पूर्ण प्रतिस्थापन है, और लाइब्रेरी के बिना सिस्टम पर काम करने के लिए pip install package की अपेक्षा करता है, या यहां तक ​​कि एक कंपाइलर के बिना, जहां अंडे वह वास्तव में चाहते हैं।

मैं यह जानना चाहता हूं कि निर्माण पाइप द्वारा ट्रिगर किया गया है, इसलिए यदि मैं पुस्तकालय की कमी के कारण विफल रहता हूं तो मैं एक दोस्ताना "पाइप! = Easy_install" संदेश प्रदान कर सकता हूं। इसे सही होने की आवश्यकता नहीं है, बस pip install package के सबसे आम मामलों को पकड़ें। निरीक्षण पर, यह यह करने के लिए एक विशेष रूप से मजबूत तरीका है की तरह प्रतीत नहीं होता है, और सबसे अच्छा मैं के साथ आए हैं है:

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

वहाँ का पता लगाने के लिए एक बेहतर (या बेहतर अभी तक, सरकारी) रास्ता नहीं है setup.py से पीआईपी?

+0

लाइब्रेरी मौजूद नहीं होने पर त्रुटि संदेश "setup.py इंस्टॉल" चलाने के दौरान अलग होने की आवश्यकता क्यों है? – joeforker

+0

जब आप 'setup.py install' चलाते हैं, तो आप निश्चित रूप से स्रोत से निर्माण कर रहे हैं। जब आप 'पीआईपी इंस्टॉल' चलाते हैं तो लोग द्विआधारी उम्मीद कर सकते हैं लेकिन उन्हें नहीं प्राप्त कर रहे हैं (उपयोगकर्ता वास्तव में पीआईपी और easy_install के बीच अंतर को समझ नहीं पाते हैं)। यह प्रश्न अब मेरे विशेष मामले से प्रासंगिक नहीं है, क्योंकि पीपी 1.5 डिफ़ॉल्ट रूप से पहियों का समर्थन करता है। – minrk

+0

कुछ और संदर्भ: पूछने के समय (दो साल पहले), मेरा पैकेज अक्सर उन मशीनों पर स्थापित किया गया था जिनमें कोई कंपाइलर नहीं था, और पीआईपी ने कोई बाइनरी प्रारूप समर्थित नहीं किया था। easy_install बस ठीक काम किया, लेकिन पाइप संकलन करने में विफल हो जाएगा। इस वजह से, मैं उन लोगों को सूचित करना चाहता था जिनके 'पाइप इंस्टॉल' विफल रहे हैं कि easy_install बेहतर हो सकता है। – minrk

उत्तर

-1

क्या आप शायद पाइप चलाने की कोशिश करने के लिए उपप्रोसेस/ओएस का उपयोग करने का प्रयास कर सकते हैं, फिर यदि यह विफल हो जाता है, तो आप जानते हैं कि कोई पाइप नहीं है।

+0

लेकिन अगर ऐसा नहीं होता है, तो इसका मतलब कुछ भी नहीं होगा। –

+3

यह जानकर कि पीआईपी मौजूद नहीं है, क्योंकि मैं यह देख रहा हूं कि यह वास्तव में उपयोग में है या नहीं। इसके अलावा, पीआईपी की उपस्थिति के लिए एक आसान जांच 'आयात पाइप 'होगी। – 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

यह एक और सुंदर नोट है, हालांकि मैं झूठी सकारात्मक को कम करने के लिए और अधिक विशिष्ट होना चाहता हूं, उदाहरण: 'use_pip = os.path.basename (os.path.dirname (__ फ़ाइल __))। Startwith ('pip -')'। यह देखते हुए कि कोई भी ऐसा उत्तर नहीं दे रहा है जो दस्तावेज या आधिकारिक है, और निजी एपीआई में झूठे सकारात्मक और/या परिवर्तनों के प्रति संवेदनशील नहीं है, ऐसा लगता है कि पीपी लेखकों के पास पैकेजों के उपयोग के लिए कोई इरादा नहीं है कि पीआईपी उपयोग में है। – minrk

+0

मित्रता के लिए +1 – Cacovsky

+1

'__file__' समाधान पी 2.7 2014-10-27 के साथ काम नहीं कर रहा है,' __file__' में कोई 'पीआईपी' नहीं है। 'os.environ' के पास मूल्य '/ run/shm/r/ven/bin/pip' के साथ एक कुंजी '_' है। यह 'पीआईपी इंस्टॉल-ए के माध्यम से स्थापित है। -यू', तो शायद '__file__' समाधान अधिक विशिष्ट पाइप इंस्टॉल के साथ काम करता है, लेकिन शायद '_' कुंजी अधिक सामान्य है? –

0

आप wheels कि रंज स्थापित कर सकते हैं के निर्माण पर विचार किया है?

+0

अब मैं पहियों का निर्माण करता हूं। जब मैंने यह सवाल पूछा, तो पहिये मौजूद नहीं थे। – minrk

संबंधित मुद्दे