python - पायथन 3 उपप्रक्रिया आउटपुट




python-3.x subprocess (2)

मैं / var / log / syslog में वर्तमान में लाइनों की संख्या निर्धारित करने के लिए लिनक्स वर्ड गिन उपयोगिता wc चलाने के लिए इच्छुक हूं, इसलिए मैं यह जान सकता हूं कि यह बढ़ रहा है मैंने विभिन्न परीक्षणों की कोशिश की है, और जब मुझे परिणाम प्राप्त होता है wc से, इसमें लाइन लाइन और साथ ही कमांड (जैसे, var / log / syslog) दोनों शामिल हैं।

तो यह वापस आ रहा है: 1338 / var / log / syslog लेकिन मैं केवल लाइन गिनती चाहता हूं, इसलिए मैं / var / log / syslog भाग को पट्टी करना चाहता हूं, और सिर्फ 1338 रखना है।

मैंने इसे टेस्टटिंग से स्ट्रिंग में परिवर्तित करने की कोशिश की है, और फिर परिणाम निकाल कर, लेकिन कोई खुशी नहीं। स्ट्रिंग और स्ट्रिपिंग, डिकोडिंग, आदि में परिवर्तित करने की समान कहानी - सभी मैं उस आउटपुट का उत्पादन करने में असफल हूं जो मैं ढूंढ रहा हूं।

ये कुछ उदाहरण हैं जो मुझे मिलते हैं, syslog में 1338 लाइनों के साथ:

  • b'1338 / var / log / syslog \ n '
  • 1338 / var / log / syslog

यहाँ कुछ परीक्षण कोड है जो मैंने कोशिश की है और इस अखरोट को हल करने के लिए लिखा है, लेकिन कोई समाधान नहीं है:

import subprocess

#check_output returns byte string
stdoutdata = subprocess.check_output("wc --lines /var/log/syslog", shell=True)
print("2A stdoutdata: " + str(stdoutdata))
stdoutdata = stdoutdata.decode("utf-8")
print("2B stdoutdata: " + str(stdoutdata))    
stdoutdata=stdoutdata.strip()
print("2C stdoutdata: " + str(stdoutdata))    

इस से उत्पादन है:

  • 2 ए स्टडआउटडेटा: बी'1338 / var / log / syslog \ n '

  • 2 बी स्टडआउटडेटा: 1338 / var / log / syslog

  • 2 सी स्टैटआउटः 1338 / var / log / syslog

  • 2 डी स्टैडेटडेटा: 1338 / var / log / syslog


मैं सुझाव देता हूं कि आप subprocess.getoutput() उपयोग करते हैं, क्योंकि वह ठीक वही करता है जो आप चाहते हैं- शेल में एक कमांड चलाते हैं और स्ट्रिंग आउटपुट प्राप्त करते हैं ( बाइट स्ट्रिंग आउटपुट के विपरीत)। फिर आप सफेद स्थान पर विभाजित कर सकते हैं और स्ट्रिंग की लौटी सूची से पहले तत्व को प्राप्त कर सकते हैं।

इसे इस्तेमाल करे:

import subprocess
stdoutdata = subprocess.getoutput("wc --lines /var/log/syslog")
print("stdoutdata: " + stdoutdata.split()[0])

शेल और डीकोडिंग फ़ाइल नामों को प्रारंभ करने से बचने के लिए, जो कि मनमाना बाइट अनुक्रम ( '\0' को छोड़कर) * निक पर हो सकता है, आप फ़ाइल को stdin के रूप में पास कर सकते हैं:

import subprocess

with open(b'/var/log/syslog', 'rb') as file:
    nlines = int(subprocess.check_output(['wc', '-l'], stdin=file))
print(nlines)

या आप किसी भी डीकोडिंग त्रुटियों को अनदेखा कर सकते हैं:

import subprocess

stdoutdata = subprocess.check_output(['wc', '-l', '/var/log/syslog'])
nlines = int(stdoutdata.decode('ascii', 'ignore').partition(' ')[0])
print(nlines)




bytestring