2012-01-23 12 views
10

मैं अपने आवेदन के लिए एक सरल अजगर पटकथा लिखी और पूर्वनिर्धारित कुछ तेजी से आदेशों बनाने आदिसबप्रोसेस 'stdout डेटा को असंकालिक रूप से कैसे प्राप्त करें?

तरह मैं प्रणाली आदेशों (लिनक्स) चलाने के लिए एक समारोह में लिखा है:

def runCommand(commandLine): 
    print('############## Running command: ' + commandLine) 
    p = subprocess.Popen(commandLine, shell = True, stdout = subprocess.PIPE) 
    print (p.stdout.read().decode('utf-8')) 

सब कुछ एक को छोड़कर अच्छी तरह से काम कुछ बातें:

  • मैं cmake उपयोग कर रहा हूँ और यह उत्पादन रंग का है। आउटपुट में रंगों को बचाने की कोई संभावना है?

  • प्रक्रिया समाप्त होने के बाद मैं आउटपुट देख सकता हूं। उदाहरण के लिए, लंबे समय तक रन बनाते हैं लेकिन मैं केवल पूर्ण संकलन के बाद आउटपुट देख सकता हूं। इसे असंकालिक रूप से कैसे करें?

उत्तर

12

मैं रंगों के बारे में यकीन नहीं है, लेकिन यहाँ एक समय में उपप्रक्रिया के stdout एक पंक्ति मतदान का तरीका देखें:

import subprocess 
proc = subprocess.Popen('cmake', shell=True, stdout=subprocess.PIPE) 
while proc.poll() is None: 
    output = proc.stdout.readline() 
    print output 

मत भूलना, साथ ही stderr से पढ़ने के लिए के रूप में मुझे यकीन है कि cmake हूँ वहाँ जानकारी उत्सर्जित करेगा।

+0

ठीक है, धन्यवाद। यह काम करता हैं। – Ockonal

2

से पहले ही खत्म कैसे अपने प्रक्रिया के उत्पादन प्राप्त करने के लिए के बारे में, यह है कि जगह करने के लिए संभव हो जाना चाहिए:

साथ
p.stdout.read 

:

for line in p.stdout: 

रंग को बचाने के लिए कैसे के बारे में आउटपुट, इसके बारे में कुछ खास नहीं है। उदाहरण के लिए, यदि पंक्ति आउटपुट किसी फ़ाइल में सहेजा जाता है, तो अगली बार cat <logfile> निष्पादित किया जाता है, कंसोल भागने के दृश्यों की व्याख्या करेगा और अपेक्षित रंगों को प्रदर्शित करेगा।

+0

'readline()' के साथ मेरे पास टेक्स्ट की बजाय पंक्ति में संख्याएं हैं, क्या गलत है? – Ockonal

+1

@ ओकोनल असल में यदि आप लूप का उपयोग करते हैं, तो 'readline' का उपयोग करने की कोई आवश्यकता नहीं है। आप दोनों रणनीतियों [यहां] का एक उदाहरण पा सकते हैं (http://stackoverflow.com/q/2804543/183066)। – jcollado

+0

वास्तव में 'p.stdout में लाइन के लिए' पायथन 2 में अच्छा नहीं है http://stackoverflow.com/questions/2804543/read-subprocess-stdout-line-by-line#comment11236752_2813530 –

0

async उत्पादन की तरह कुछ करने के करने के लिए: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440554

सुनिश्चित नहीं हैं कि अगर आप रंग का उत्पादन कर सकता है। यदि आप बच निकले रंग कोड प्राप्त कर सकते हैं तो आप सक्षम हो सकते हैं।

+0

अगर हमें रंग कोड मिलते हैं तो टर्मिनल उनका अनुवाद करेगा। समस्या यह है कि, अधिकांश एप्लिकेशन टर्मिनल से जुड़े होने या किसी अन्य एप्लिकेशन में पाइप होने के बीच अंतर करते हैं। इन अनुप्रयोगों को अभी भी रंग कोड बनाने के लिए मनाने का एकमात्र तरीका यह है कि प्राप्त करने वाला ऐप (इस मामले में हमारी पायथन प्रक्रिया) वास्तव में एक टाटी है और पाइप नहीं है। एक कार्य बहुत आसान कहा जाता है ... –

4

आपको रंग नहीं मिल रहा है क्योंकि cmake पता लगाता है कि इसका स्टडआउट एक टर्मिनल है, अगर ऐसा नहीं है तो यह अपने स्वयं के आउटपुट को रंग नहीं देता है। कुछ कार्यक्रम आपको रंग उत्पादन को मजबूर करने का विकल्प देते हैं। दुर्भाग्य से cmake नहीं है, तो आप वहां भाग्य से बाहर हैं। जब तक आप cmake पैच नहीं करना चाहते हैं।बिल्ली के लिए पाइप यह

# grep test test.txt 
test 
^ 
| 
|------- this word is red 

अब:

कार्यक्रमों के बहुत सारे यह करते हैं, उदाहरण के ग्रेप के लिए

# grep test test.txt | cat 
test 
^ 
| 
|------- no longer red 

grep विकल्प --color=always रंग मजबूर करने के लिए:

# grep test test.txt --color=always | cat 
test 
^ 
| 
|------- red again 
-1

टिप्पण लायक यहां छद्म टर्मिना के रूप में script कमांड का उपयोग है एल और रीडायरेक्ट (पाइप) फ़ाइल वर्णनकर्ता के बजाय एक tty के रूप में पता लगाया जा, देखें: bash command preserve color when piping

वर्क्स एक आकर्षण की तरह ...

प्रश्न में उदाहरण के अनुसार बस script निष्पादित cmake करते हैं:

import subprocess 
proc = subprocess.Popen('script cmake', shell=True, stdout=subprocess.PIPE) 
while proc.poll() is None: 
    output = proc.stdout.readline() 
    print output 

यह चाल cmake यह सोचने में है कि इसे टर्मिनल से निष्पादित किया जा रहा है और आपके बाद के एएनएसआई कैंडी का उत्पादन होगा।

एन ज्वॉय!

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