2010-10-20 17 views
7

मैं subprocess के माध्यम से rtmpdump को कॉल कर रहा हूं और अपने आउटपुट को फ़ाइल में रीडायरेक्ट करने का प्रयास कर रहा हूं। समस्या यह है कि मैं बस इसे पुनर्निर्देशित नहीं कर सकता।पायथन: मैं इस आउटपुट को रीडायरेक्ट कैसे करूं?

मैंने पहली बार खोले गए फ़ाइल में sys.stdout सेट करने का प्रयास किया। यह कहता है, ls, लेकिन rtmpdump के लिए नहीं। मैंने sys.stderr को बस सुनिश्चित करने के लिए सेट करने का प्रयास किया और यह भी काम नहीं किया।

मैंने कमांड लाइन तर्क के साथ ">> फ़ाइल" का उपयोग करने की कोशिश की लेकिन फिर से यह काम नहीं कर रहा है।

रिकॉर्ड के लिए, किसी कारण से, ग्रहण rtmpdump के आउटपुट प्रिंट करता है भले ही मैं subprocess.check_output के बजाय subprocess.call का उपयोग करता हूं, और प्रिंट विधि को कॉल किए बिना। यह काला जादू है!

कोई सुझाव?

संपादित करें: यहां कुछ नमूना कोड दिया गया है।

# /!\ note: need to use os.chdir first to get to the folder with rtmpdump! 
    command = './rtmpdump -r rtmp://oxy.videolectures.net/video/ -y 2007/pascal/bootcamp07_vilanova/keller_mikaela/bootcamp07_keller_bss_01 -a video -s http://media.videolectures.net/jw-player/player.swf -w ffa4f0c469cfbe1f449ec42462e8c3ba16600f5a4b311980bb626893ca81f388 -x 53910 -o test.flv' 
    split_command = shlex.split(command) 
    subprocess.call(split_command) 
+0

'stdout' आमतौर पर कुछ भी करने के बिना माता पिता के' stdout' पर पुनः निर्देशित हो जाता है डिफ़ॉल्ट रूप से। क्या आप वर्तमान में मौजूद कोड पोस्ट कर सकते हैं? –

+0

नीचे मेरा जवाब देखें। आप subprocess.popen (..) – pyfunc

+0

@pyfunc का उपयोग कर सकते हैं: मैं पॉपन का उपयोग करने के तरीके को समझने की कोशिश कर रहा हूं, मैं इसे आज़माउंगा। – dmc

उत्तर

16

sys.stdout माता पिता के उत्पादन धारा के अजगर का विचार है।

किसी भी मामले में आप बच्चे की आउटपुट स्ट्रीम को बदलना चाहते हैं।

subprocess.call और subprocess.Popen आउटपुट स्ट्रीम के लिए नाम पैरामीटर लेते हैं।

तो उस फ़ाइल को खोलें जिसे आप आउटपुट करना चाहते हैं और फिर इसे उपप्रोसेसर के उचित तर्क के रूप में पास करें।

f = open("outputFile","wb") 
subprocess.call(argsArray,stdout=f) 

>> का उपयोग करने का आपका सुझाव है कि आप बात खोल = सच उपयोग कर रहे हैं, या लगता है कि आप खोल करने के लिए अपने तर्क गुजर रहे हैं। किसी भी मामले में उपप्रोसेसर के सरणी रूप का उपयोग करना बेहतर होता है, जो एक अनावश्यक प्रक्रिया से बचता है, और खोल से कोई अजीबता।

संपादित करें:

तो मैं rtmpdump डाउनलोड किया है और यह पता करने की कोशिश की, यह जाहिर होता संदेशों stderr पर दिखाई दे रहे हैं।

निम्नलिखित कार्यक्रम के साथ

तो, कुछ भी नहीं कार्यक्रमों उत्पादन पर दिखाई देता है, और rtmpdump लॉग जब stderr.txt फ़ाइल में:

#!/usr/bin/env python 

import os 
import subprocess 

RTMPDUMP="./rtmpdump" 
assert os.path.isfile(RTMPDUMP) 
command = [RTMPDUMP,'-r','rtmp://oxy.videolectures.net/video/', 
     '-y','2007/pascal/bootcamp07_vilanova/keller_mikaela/bootcamp07_keller_bss_01', 
     '-a','video','-s', 
     'http://media.videolectures.net/jw-player/player.swf', 
     '-w','ffa4f0c469cfbe1f449ec42462e8c3ba16600f5a4b311980bb626893ca81f388' 
     ,'-x','53910','-o','test.flv'] 


stdout = open("stdout.txt","wb") 
stderr = open("stderr.txt","wb") 
subprocess.call(command,stdout=stdout,stderr=stderr) 
+0

आपने मुझे इसे हराया। अनिवार्य रूप से मेरा जवाब वही है। – pyfunc

+0

@ डबल्स लीडर: आउटपुट अभी भी ग्रहण कंसोल है। :/ – dmc

+0

@ डीएमसी क्या आप कमांड लाइन से 'rtmpdump' चला सकते हैं, एक फ़ाइल में stdout को रीडायरेक्ट कर सकते हैं, और stderr को एक अलग फ़ाइल में चला सकते हैं, यह देखने के लिए कि क्या आउटपुट रीडायरेक्ट हो जाता है? –

1

अतः

पर उपप्रक्रिया से उत्पादन हो रही है पर लिंक देखें मुझे लगता है कि जिस तरह से उत्पादन को इकट्ठा करने और यह एक करने के लिए लिखने के लिए होगा सीधे फाइल करें या फ़ाइल डिस्क्रिप्टर प्रदान करें जिनके लिए आप आउटपुट लिख सकते हैं।

कुछ इस तरह:

f = open('dump.txt', 'wb') 
p = subprocess.Popen(args, stdout=f, stderr=subprocess.STDOUT, shell=True) 
+1

अच्छा जवाब छोड़कर मैं विरासत कोड से रूपांतरणों को छोड़कर खोल = सही का उपयोग करने की अनुशंसा नहीं करता। –

+0

@ डगलस लीडर: धन्यवाद। ये सही है। मैं कोड को सत्यापित करने के लिए खोल का उपयोग कर रहा था। – pyfunc

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

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