2016-05-26 12 views
5

के माध्यम से स्थापित संकुल दिखाएं, मैं जानना चाहता हूं कि पाइप के माध्यम से कौन से पायथन पैकेज स्थापित किए गए हैं और जो आरपीएम के माध्यम से स्थापित हैं।पाइप फ्रीज: केवल पीपी

मैं के बाहर किसी वर्चुअलएन्व के बाहर चलाता हूं, और जानना चाहता हूं कि कुछ संकुल पाइप के माध्यम से स्थापित हैं या नहीं।

पृष्ठभूमि: हमारी नीति आरपीएम का उपयोग "रूट स्तर" पर करना है। मैं उन जगहों को ढूंढना चाहता हूं जहां नीति टूट गई थी।

+0

आपका स्थिति है की तरह कुछ के माध्यम से उत्पादन, आप कई virtualenvs है, और आप रूट स्तर से पिप के माध्यम से इंस्टॉल किए गए पैकेज की जाँच करना चाहते हैं? – Laszlowaty

+0

यदि 'पीपी सूची' सभी स्थापित संकुलों की एक सूची लौटाती है, तो आप 'rpm' के माध्यम से स्थापित संकुल ढूंढने के लिए 'rpm -qa' का उपयोग कर सकते हैं और दोनों का अंतर पैकेज होगा जो आपकी नीति के अनुरूप नहीं है। क्या उपरोक्त काम आपके लिए होगा? –

+0

मुझे लगता है कि दोनों नाम हमेशा समान नहीं होते हैं (बाइट प्रति बाइट), लेकिन केवल समान (मानव मस्तिष्क की तलाश में समान)। एक उदाहरण: पीआईपी फ्रीज इसे "पायथन-डेटुटिल" बताता है, आरपीएम नाम वही है। पीपी फ्रीज मुझे "तकिया" बताता है, आरपीएम के रूप में इसे पायथन-पिल्लो कहा जाता है ... – guettli

उत्तर

2

प्रश्न को थोड़ा सा कैसे चालू करें, और बस आरपीएमएस से संबंधित है और क्या नहीं है इसकी जांच करें। प्रयास करें:

import os, sys, subprocess, glob 

def type_printed(pth, rpm_dirs=False): 

    if not os.path.exists(pth): 
     print(pth + ' -- does not exist') 
     return True   
    FNULL = open(os.devnull, 'w') 
    if rpm_dirs or not os.path.isdir(pth): 
     rc = subprocess.call(['rpm', '-qf', pth], stdout=FNULL, stderr=subprocess.STDOUT) 
     if rc == 0: 
      print(pth + ' -- IS RPM') 
      return True 
     print(pth + ' -- NOT an RPM') 
     return True 
    return False 


for pth in sys.path: 
    if type_printed(pth): 
     continue 
    contents = glob.glob(pth + '/*') 
    for subpth in contents: 
     if type_printed(subpth, rpm_dirs=True): 
      continue 
     print(subpth + ' -- nothing could be determined for sure') 

और पाइप

grep -e '-- NOT' -e '-- nothing could be determined' 
+0

हाँ, बढ़िया। इस तरह मैं उन चीजों को ढूंढ सकता था जो रूट के रूप में पाइप के माध्यम से स्थापित किया गया था। मुझे पाइप पसंद है, लेकिन केवल वर्चुअलएन्व में :-) – guettli

1

अनुमान:

  • मैं लाल टोपी बारे में निश्चित नहीं हूँ, लेकिन Debian/Ubuntu के लिए।
  • मुझे लगता है कि आप सिस्टम पायथन का उपयोग कर रहे हैं।
  • मुझे नहीं लगता कि यह महत्वपूर्ण है, लेकिन आपको स्थानीय उपयोगकर्ता पैकेज इंस्टॉल के लिए pip install --user <package_name> जांचना पड़ सकता है।

डेबियन प्रणाली इंस्टॉल किए गए पैकेज पर डिफ़ॉल्ट रूप से पर स्थापित कर रहे हैं:

/usr/lib/python2.7/dist-packages/

और पिप इंस्टॉल किए गए पैकेज पर स्थापित कर रहे हैं:

/usr/bin/local/python2.7/dist-packages

सभी स्थापना पथ को देखने के लिए आप आपके पायथन खोल के अंदर चलाया जा सकता है:

import site; site.getsitepackages() 
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages'] 

pip freeze docs-l के अनुसार आपको पैकेज के स्थानीय इंस्टॉल दिखाए जाएंगे (यानी। वैश्विक पैकेज नहीं) हालांकि, आपको सही वातावरण में होना चाहिए।

pip freeze -l 

तो Virtualenvs भूमिका निभाते हैं: वे site-packages निर्देशिका का उपयोग करेगा।

locate -r '/site-packages$' 

इसके अलावा किसी भी संकुल एक अलग निर्देशिका में स्थापित सभी इस पद्धति के माध्यम से में स्थित नहीं पड़ेगा: Install a Python package into a different directory using pip?

अंतिम चाल, पिप में सही स्थापित पथ पिप शो का उपयोग कर की जाँच करें। प्रभावी रूप से, केवल पीआईपी, पाइप से पीआईपी शो में नाम प्राप्त करें और नाम -> स्थान मानचित्र के लिए आउटपुट फ़िल्टर करें।

pip freeze | awk '{split($0,a,"="); print a[1]}' | xargs -P 5 -I {} pip show {} | grep 'Name\|Location' 
+1

'पाइप फ्रीज -एल' मेरे लिए नया है। मैंने '-l' (वर्चुअलएन्व के अंदर) के बिना और बिना फ्रीज के बीच अंतर को देखा। Virtualenv "अंदर या बाहर" का पता लगाने के लिए ठीक काम करता है। लेकिन यह "आरपीएम से या पीपी से" तय करने में मदद नहीं करता है। – guettli

+0

क्या आरपीएम आपके सेटअप पर पीआईपी की तुलना में एक अलग स्थान पर स्थापित करता है? उदाहरण के लिए '/ usr/lib /' vs '/ usr/bin/local /' या यह वही है? –

+1

दुर्भाग्य से नहीं। यह एक ही स्थान पर स्थापित होता है: '/ usr/lib/python2.7/साइट-पैकेज /' – guettli

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