簡體   English   中英

python子進程communication()塊

[英]python subprocess communicate() block

我正在使用進程模塊調用外部程序(plink.exe)來登錄服務器; 但是當我呼叫通信來讀取輸出時,它就是阻塞。 代碼如下:

 import subprocess
 process = subprocess.Popen('plink.exe hello@10.120.139.170 -pw 123456'.split(), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 print process.communicate() #block here

我知道這個塊是因為plink.exe在運行plink.exe ; 但我需要在子進程終止之前讀取輸出。 反正有嗎?

communicate方法的全部目的是等待進程完成並返回所有輸出。 如果您不想等,請不要致電communicate 而是從stdoutstderr屬性讀取以讀取輸出。

如果進程輸出到stdoutstderr (並且你想單獨讀取它),你必須小心實際讀取它們而不阻塞,或者你可以死鎖。 這在Windows上相當困難,您可能希望使用pexpect模塊。

我遇到了類似的情況,我必須執行單個命令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())

也許因為“plink.exe”需要接受輸入參數,如果你沒有傳遞它們,它會阻塞直到給出數據,你可以嘗試在方法中添加參數communicate(input)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM