Python 使用Popen时,如何读取标准输出?

Python 使用Popen时,如何读取标准输出?,python,subprocess,Python,Subprocess,我正在尝试使用Popen启动shell进程,执行命令,打印要输出的命令,以及打印命令的输出(如果有)。写入stdin工作正常,但尝试读取stdout会导致程序冻结 以下是我的节目: with Popen(["/bin/sh"], stdin=PIPE, stdout=PIPE, stderr=STDOUT, text=True, bufsize=0) as proc: with open("script.txt") as scriptFile:

我正在尝试使用
Popen
启动shell进程,执行命令,打印要输出的命令,以及打印命令的输出(如果有)。写入
stdin
工作正常,但尝试读取
stdout
会导致程序冻结

以下是我的节目:


with Popen(["/bin/sh"], stdin=PIPE, stdout=PIPE, stderr=STDOUT, text=True, bufsize=0) as proc:
    with open("script.txt") as scriptFile:
        for line in scriptFile.readlines():
            proc.stdin.write(line)
            print(f"$ {line.strip()}")
            # Reading from proc.stdout locks the program.
            for outputLine in proc.stdout.readlines():
                print(outputLine)
这里有一个简化的script.txt。(真实版本创建了一个git存储库,并演示了各种git命令的使用。)

如果我不尝试读取
stdout
script.txt中的所有命令(以及我的包含多个git命令的真实版本),那么这些命令都可以正常工作


是否有任何方法可以从
stdout
获取命令的输出,并将其写入
stdin

是否有原因不只是直接使用
/bin/sh script.txt
执行脚本?问题是,您试图在生成任何输出之前读取输出。在循环的第一次迭代中,您只发送了
mkdir项目
,它不会产生任何输出。此外,
proc.stdout.readlines()
会一直读取,直到子流程关闭管道为止。但是在shell进程完成之前,它不会这样做。也许你应该使用
pexpect
@Barmar。我不是直接执行脚本,因为我想在程序打印的内容中插入命令及其输出。(这实际上是实际项目的一个子集,它不在问题的范围之内。实际项目将命令及其输出与标记穿插在一起,以创建一篇文章。)
mkdir project
cd project
echo "This is line 1.\nThis is line 2." > text1.txt
cat text1.txt