2012-03-16 1 views
7

से लिनक्स कमांड चला रहा है मुझे इस लिनक्स कमांड को पायथन से चलाने और आउटपुट को एक चर में असाइन करने की आवश्यकता है।पायथन

ps -ef | grep rtptransmit | grep -v grep 

मैंने ऐसा करने के लिए पायथन कमांड लाइब्रेरी का उपयोग करने का प्रयास किया है।

import commands 
a = commands.getoutput('ps -ef | grep rtptransmit | grep -v grep') 

लेकिन कट ऑफ का अंत हो जाता है। उत्पादन मैं मिलता है:

'nvr  20714 20711 0 10:39 ?  00:00:00 /opt/americandynamics/venvr/bin/rtptransmit setup_req db=media camera=6 stream=video substream=1 client_a' 

लेकिन अपेक्षित आउटपुट है:

nvr  20714 20711 0 10:39 ?  00:00:00 /opt/americandynamics/venvr/bin/rtptransmit setup_req db=media camera=6 stream=video substream=1 client_address=192.168.200.179 client_rtp_port=6970 override_lockout=1 clienttype=1 

किसी को भी काट होने से उत्पादन को रोकने के लिए या किसी को भी किसी अन्य विधि का सुझाव दे सकता है पता है?

उत्तर

8

ps जाहिरा तौर पर इसके उत्पादन को सीमित करता है टर्मिनल के प्रकल्पित चौड़ाई में फिट। आप $COLUMNS पर्यावरण चर के साथ या --columns विकल्प ps के साथ इस चौड़ाई को ओवरराइड कर सकते हैं।

commands मॉड्यूल बहिष्कृत किया गया है। ps -ef के आउटपुट प्राप्त करने के लिए subprocess का उपयोग करें और पायथन में आउटपुट फ़िल्टर करें। shell=True का प्रयोग न करें के रूप में अन्य उत्तर ने सुझाव दिया, यह बस इस मामले में ज़रूरत से ज़्यादा है:

ps = subprocess.Popen(['ps', '-ef', '--columns', '1000'], stdout=subprocess.PIPE) 
output = ps.communicate()[0] 
for line in output.splitlines(): 
    if 'rtptransmit' in line: 
     print(line) 

तुम भी एक pgrep आदेश है जिसके द्वारा आप सीधे विशिष्ट प्रक्रियाओं के लिए खोज सकते देखने के लिए लेने के लिए कर सकते हैं।

3

मैं बाहरी आदेश चलाने के लिए आमतौर पर subprocess का उपयोग करता हूं। आपके मामले के लिए, आप उत्पादन out चर में हो जाएगा निम्नलिखित

from subprocess import Popen, PIPE 

p = Popen('ps -ef | grep rtptransmit | grep -v grep', shell=True, 
      stdout=PIPE, stderr=PIPE) 
out, err = p.communicate() 

की तरह कुछ कर सकते हैं।

+1

-1 'grep' और 'shell = True' के बेकार उपयोग के लिए। – lunaryorn

+0

यदि आप कमांड में पाइप का उपयोग करना चाहते हैं तो 'shell' की आवश्यकता है। 'Grep' के बारे में, मैंने वास्तव में सिर्फ प्रश्न से कमांड की प्रतिलिपि बनाई और चिपकाया। मुझे लगता है कि दूसरा 'grep' मुझे संदेह है क्योंकि कभी-कभी' grep' कमांड जिसे हम निष्पादित करते हैं, वह भी grep-ed लगता है और इसलिए इसे हटाने की आवश्यकता है। यह वास्तव में 'grep [r] tptransmit' – fajran

+0

का उपयोग करके टाला जा सकता है मुझे पता है कि कमांड में पाइप का उपयोग करने के लिए' shell = True' की आवश्यकता है, और दूसरा 'grep' पहले' grep' कमांड को हटाने के लिए है फ़िल्टर की गई प्रक्रिया सूची। लेकिन दोनों, इस मामले में पाइप और 'grep' अनिवार्य हैं। – lunaryorn

4

commands बहिष्कृत है, आपको इसका उपयोग नहीं करना चाहिए। का प्रयोग करें subprocess बजाय

import subprocess 
a = subprocess.check_output('ps -ef | grep rtptransmit | grep -v grep', shell=True) 
+2

-1। – lunaryorn

+0

@ लूनरीर्न: सवाल यह है कि पायथन में उस आदेश को कैसे चलाया जाए, यह नहीं कि पाइथन में उसे कैसे दबाया जाए। – vartec

+0

दरअसल सवाल यह है कि 'ps' आउटपुट के छिड़काव से कैसे बचें। लेकिन यह मेरे बिंदु के विपरीत नहीं है ... – lunaryorn