2010-01-25 15 views
15

मैं सबप्रोसेस मॉड्यूल का उपयोग कर रहा हूं ताकि सर्वर पर लॉग-इन करने के लिए बाहरी प्रोग्राम (plink.exe) को कॉल किया जा सके; लेकिन जब मैं आउटपुट पढ़ने के लिए संवाद करता हूं, तो यह अवरुद्ध हो रहा है। कोड के नीचे है:पायथन उपप्रोसेस संचार() ब्लॉक

import subprocess 
process = subprocess.Popen('plink.exe [email protected] -pw 123456'.split(), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
print process.communicate() #block here 

मैं जानता हूँ कि ब्लॉक है, क्योंकि plink.exe यह अभी भी चल रहा है; लेकिन मुझे subprocess समाप्त होने से पहले आउटपुट को पढ़ने की जरूरत है। क्या उसे करने का कोई तरीका है?

+0

आप plink के साथ बातचीत करने की जरूरत है, या आप बस फोन करना और पढ़ने की जरूरत है अवरुद्ध किए बिना std आउटपुट? – Khelben

+0

संबंधित: [पायथन: subprocess.communicate()] से स्ट्रीमिंग इनपुट पढ़ें (http://stackoverflow.com/q/2715847/4279) – jfs

उत्तर

26

communicate विधि का पूरा उद्देश्य प्रक्रिया को समाप्त करने और सभी आउटपुट लौटने की प्रतीक्षा करना है। अगर आप प्रतीक्षा नहीं करना चाहते हैं, तो communicate पर कॉल न करें। इसके बजाय, आउटपुट पढ़ने के लिए stdout या stderr विशेषता से पढ़ें।

यदि प्रक्रिया stdout और stderr (और आप इसे अलग से पढ़ना चाहते हैं) दोनों को आउटपुट करते हैं, तो आपको वास्तव में अवरुद्ध किए बिना दोनों से पढ़ने के लिए सावधान रहना होगा, या आप डेडलॉक कर सकते हैं। यह विंडोज पर काफी कठिन है, और आप इसके बजाय pexpect मॉड्यूल का उपयोग करना चाह सकते हैं।

+0

'pexpect' विंडोज पर काम नहीं करता है। ['asyncio'] (http://stackoverflow.com/a/20697159/4279) या [धागे] (http://stackoverflow.com/a/4896288/4279) अवरुद्ध किए बिना दोनों धाराओं को पढ़ने के लिए उपयोग किया जा सकता है। – jfs

0

मुझे ऐसी ही स्थिति का सामना करना पड़ा जहां मुझे एक कमांड lmstat -a निष्पादित करना पड़ा और फिर टर्मिनल का आउटपुट प्राप्त करना पड़ा।

तुम सिर्फ उत्पादन को पढ़ने के लिए एक एकल आदेश चला और उसके बाद की जरूरत है, तो आप निम्न कोड का उपयोग कर सकते हैं:

import subprocess 

Username = 'your_username' 
Password = 'your_password' 
IP = 'IP_of_system' 
Connection_type = '-ssh' #can have values -ssh -telnet -rlogin -raw -serial 

p = subprocess.Popen(['plink', Connection_type, '-l', Username, '-pw', Password, IP], \ 
        shell = False, stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
out, err = p.communicate('lmstat -a\nexit\n'.encode()) 
print(out.decode()) 
+1

@ थॉमस ने कहा, यह एक अवरुद्ध है और एक गैर-अवरुद्ध दृष्टिकोण नहीं है – Fookatchu

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