2016-01-31 7 views
8

मैं कुछ कोड लिख रहा हूं जो दो पीआईपी-प्रबंधित पायथन इंस्टॉलेशन के बीच मतभेदों की रिपोर्ट करेगा और मेल करेगा।पायथन: प्रोग्रामिंग चल रहा है "पीआईपी सूची"

मैं पीपी के उपप्रोग्राम आमंत्रण किए बिना pip list द्वारा प्रदान की गई जानकारी को प्रोग्रामेटिक रूप से कैसे प्राप्त कर सकता हूं?

pip.utils.get_installed_distributions() 

रिटर्न आप इंस्टॉल किए गए पैकेज की सूची:

import pip 

pip.main(['list']) 

# you can get details on package using show: 

pip.main(['show', 'wheel']) 

ठीक है तो बेहतर तरीका है:

+0

यदि कोई lib आंतरिक रूप से उपप्रोसेस का उपयोग करके ऐसा कर रहा था तो क्या यह समस्या होगी? – Cripto

+0

यह ठीक होगा, जब तक कि मेरे कोड को उन विभिन्न प्रणालियों पर उपप्रोसेस का आह्वान करने की जटिलताओं को नहीं जानना पड़ेगा जिन्हें मैं परिचित नहीं हूं। –

+0

ओपी। मैंने @ विटोर उत्तर को देखने से पहले मैंने उस प्रश्न को लिखा था। मुझे वह जवाब पसंद है। – Cripto

उत्तर

9

पिप सिर्फ अजगर मॉड्यूल, तो बस इसे आयात और list कहते हैं।

packages = pip.utils.get_installed_distributions() 

p = packages[0] 

p.project_name 
p.version 
p.egg_name 
p.location 

आप देख सकते हैं क्या pip listhere

स्रोत कोड से कर रही है इसके अलावा get_installed_distributions मापदंडों की पूरी गुच्छा स्वीकार (वर्तमान virtualenv से) केवल स्थानीय संकुल लौटने के लिए आदि कृपया मदद here देखते हैं।

वहाँ भी _vendor मॉड्यूल से निम्न स्तर आदेश अंतर्निहित है:

[p for p in pip._vendor.pkg_resources.working_set] 

हालांकि get_installed_distributions सरल एपीआई प्रदान करते हैं।

+0

परिणामस्वरूप आउटपुट कैसे प्राप्त कर सकता हूं? x = pip.main (['list']) stdout पर जाने वाले परिणामों के साथ, सफल निष्पादन को इंगित करने वाला x से 0 सेट करता है। –

+0

यहां दिए गए तरीके की संख्या है: http://stackoverflow.com/questions/5136611/capture-stdout-from-a-script-in-python लेकिन मैं उनमें से किसी को पसंद नहीं है, क्योंकि वे सब बोझिल कर रहे हैं, करते हैं मैं इसे थोड़ा अलग तरीके से कॉल करने के तरीके को देखता हूं, – vittore

+0

@MarkHarrison मेरा अद्यतन उत्तर – vittore

1

पूर्णता के लिए, यहां विटोर के pip.main() विचार स्टडआउट के कब्जे के साथ फिसल गए हैं। बेशक get_installed_distributions() का उपयोग करना पसंदीदा समाधान है।

import contextlib 
@contextlib.contextmanager 
def capture(): 
    import sys 
    from cStringIO import StringIO 
    oldout,olderr = sys.stdout, sys.stderr 
    try: 
     out=[StringIO(), StringIO()] 
     sys.stdout,sys.stderr = out 
     yield out 
    finally: 
     sys.stdout,sys.stderr = oldout, olderr 
     out[0] = out[0].getvalue() 
     out[1] = out[1].getvalue() 

with capture() as out: 
    import pip 
    pip.main(['list']) 

print out 
    ['awscli (1.7.45)\nboto (2.38.0) ... 
संबंधित मुद्दे