簡體   English   中英

subprocess.communicate()發送垃圾到進程?

[英]subprocess.communicate() sending garbage to process?

我在使用subprocess.communicate()的子進程中讀取/寫入stdin / stdout時遇到問題。

這是子進程(在C中)

#include <stdio.h>

int main ()
{
    char buf[128];
    printf("test\n");
    gets(buf);
    printf("%s", buf);
    return 0;
}

這是python中調用該子程序的程序

import subprocess

proc = subprocess.Popen('./test', stdin=subprocess.PIPE, stdout=subprocess.PIPE)

stdin, stderr = proc.communicate()
print stdin
proc.communicate(stdin)
stdin, stderr = proc.communicate()
print stdin

print stdin

我希望這會打印

test
input was test:

但是,似乎proc.communicate()會導致gets()的EOF,從而導致子應用程序終止。 無論如何,我可以在不發送EOF的情況下與子應用程序進行通信嗎? IE瀏覽器,我想閱讀該應用程序,然后再寫它。

Popen.communicate()的文檔中:

發送數據到標准輸入。 從stdout和stderr讀取數據,直到到達文件末尾。 等待進程終止。

這意味着您只能為子流程調用一次communicate()

獲得實時輸出可能有些棘手,但是在您的示例中,它並不難,因為您僅嘗試讀取一行。 以下應該工作:

import subprocess

proc = subprocess.Popen('./test', stdin=subprocess.PIPE, stdout=subprocess.PIPE)

outdata = proc.stdout.readline()
print outdata
outdata, errdata = proc.communicate('output was ' + outdata)
print outdata

請注意,我重命名了一些變量,因為子進程的輸出對於Python進程而言並不是真正的stdin。

暫無
暫無

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

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