2011-01-31 6 views
8

के बीच पाइथन पाइपिंग आउटपुट मैं कुछ कोड पर काम कर रहा हूं जो एसएसएच पर एक ब्लॉक डिवाइस डीडी करेगा, और मैं इसे सबप्रोसेस के साथ करना चाहता हूं ताकि मैं स्थानांतरण के दौरान डीडी की स्थिति की निगरानी कर सकूं (हत्या एसआईजीयूएसआर 1 के साथ डीडी प्रक्रिया को वर्तमान स्थिति प्राप्त करने के लिए, और चयन का उपयोग करके पढ़ना)।दो subprocesses

आदेश है कि मैं लागू करने के लिए कुछ इस तरह होगा कोशिश कर रहा हूँ:

dd if=/dev/sda | ssh [email protected] 'dd of=/dev/sda' 

वर्तमान पद्धति मैंने कोशिश की थी:

dd_process = subprocess.Popen(['dd','if=/dev/sda'],0,None,None,subprocess.PIPE, subprocess.PIPE) 
ssh_process = subprocess.Popen(['ssh','[email protected]','dd of=/dev/sda'],0,None,dd_process.stdout) 

लेकिन जब मैं इस चलाने के लिए, SSH प्रक्रिया हो जाता है 10-40 सेकंड के बाद निष्क्रिय।
क्या मैं पूरी तरह से यहां जा रहा हूं, या इस तरह के उपप्रजातियों के बीच पाइप करने का कोई तरीका नहीं है?

संपादित करें: मेरे असली कोड को चालू करने में होस्टनाम नहीं था। चीजों को करने का यह सही तरीका है।

+1

मुझे आशा है कि आप कुंजी आधारित प्रमाणीकरण या अन्य गैर-सहभागी प्रणाली का उपयोग कर रहे हैं। –

+0

जाहिर है;) मैंने बस –

+0

उदाहरण को संक्षिप्त करने के लिए उस एसएसएच तर्क को लिया है: [मैं पाइप द्वारा एकाधिक प्रक्रियाओं को जोड़ने के लिए उपप्रोसेस.पोपेन का उपयोग कैसे करूं?] (Http://stackoverflow.com/q/295459/4279) – jfs

उत्तर

13
from subprocess import Popen, PIPE 
dd_process = Popen(['dd', 'if=/dev/sda'], stdout=PIPE) 
ssh_process = Popen(['ssh', '[email protected]', 'dd','of=/dev/sda'],stdin=dd_process.stdout, stdout=PIPE) 
dd_process.stdout.close() # enable write error in dd if ssh dies 
out, err = ssh_process.communicate() 

यह दूसरी प्रक्रिया को पीआईपीई करने का तरीका है। (ssh_process में stdin नोटिस)

+0

'grep_process' ?! –

+1

वैसे, मेरे पास पहले से ही यही था, और यह अभी भी काम नहीं कर रहा है। विशेष रूप से त्रुटि जब एसएसएच निष्क्रिय हो जाता है: ssh: dd of =/dev/sda: नाम संकल्प में अस्थायी विफलता –

+1

@ क्रिस्टियन, क्षमा करें - यह ssh_process होना चाहिए। @ फिलिप - त्रुटि को आपके डोमेन और इंटरनेट कनेक्टिविटी (जिसे आपने example.com के रूप में दिया है) के साथ करना है। क्या आप सीधे पूरा कर सकते हैं? वह अजगर का उपयोग किए बिना है? –

4

sh पायथन लाइब्रेरी ओएस कमांड को कॉल करना और उन्हें पाइप करना आसान बनाता है।

प्रलेखन से:

for line in tr(tail("-f", "test.log", _piped=True), "[:upper:]", "[:lower:]", _iter=True): 
    print(line) 
+0

कि 'sh' मॉड्यूल वास्तव में अच्छा है। साझा करने के लिए धन्यवाद। – mpontillo

+0

लेकिन अनचेक इनपुट के साथ उपयोग करना खतरनाक है – LtWorf