簡體   English   中英

python子進程-如何檢查PIPE中是否沒有任何新數據?

[英]python subprocess - How to check if there is not any new data in the PIPE?

我有以下示例:

import subprocess

p = subprocess.Popen("cmd",stdin = subprocess.PIPE, stdout=subprocess.PIPE )
p.stdin.write(b'cd\\' + b'\r\n')
p.stdin.write(b'dir' + b'\r\n')
p.stdin.write(b'\r\n')



while True:
    line = p.stdout.readline()
    print(line.decode('ascii'), end='')
    if line.rstrip().decode('ascii') == 'C:\>': #I need to check at this point if there is new data in the PIPE
        print('End of File')
        break

我正在監聽PIPE子進程的任何輸出,如果沒有任何新數據通過PIPE,我想停止讀取。 我想要一條控制語句,告訴我PIPE為空。 如果我的進程凍結或以意外的結果結束,這將幫助我避免出現問題。

除非該過程結束或您希望停止讀取信號,否則無法提前知道管道中是否有數據的好方法,因為該命令僅在達到您的字節數時才會終止要讀取[.read(n)],到達換行符char [.readline()]或到達文件的末尾(在過程結束之前不存在)。

但是,您不需要運行cmd.exe來運行程序,因為您的程序已經在cmd shell中運行了。

我建議您使用子進程直接調用程序,並在代碼中處理異常/ return_code。 你可以做類似...

import subprocess
import time

p = subprocess.Popen("your_program.exe",
                     "-f", "filename",
                     stdin=subprocess.PIPE,
                     stdout=subprocess.PIPE)

# If you have to use stdin, do it here.
p.stdin.write('lawl here are my inputs\n')

run_for = 0
while p.poll() == None:
    time.sleep(1)
    if run_for > 10:
        p.kill()
        break
    run_for += 1

if p.return_code == 0:
    ...handle success...
else:
    ...handle failure...

您可以循環執行此操作,並啟動一個新進程,該進程將運行下一個文件。

如果它昂貴的旋轉起來的程序(如果它不是那么現在停止閱讀,因為它是關於獲得尷尬的),那么也許(這是一個總的黑客,但)你的進程已經運行了一段時間后,你可以通過一個特別p.stdin的奇數但無害的字符串,例如p.stdin.write("\\n~%$%~\\n")

如果您可以解決這個問題,那么您可以做類似...

for line in p.stdout.readlines():
    if '~%$%~' in line:
        break

但是,請不要這樣做。 真是駭人聽聞。

暫無
暫無

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

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