持久化的subprocess.Popen会话

2 投票
1 回答
5018 浏览
提问于 2025-04-18 03:10

我想先运行一个命令,然后再在同一个环境中运行另一个命令(比如如果我在第一个命令中设置了一个环境变量,我希望它在第二个命令中也能用到)。我试了这个:

import subprocess

process = subprocess.Popen("echo \"test\"", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE);

process.stdin.write("echo \"two\"\n")
process.stdin.flush()

stdout, stderr = process.communicate()
print "stdout: " + stdout
print "stderr: " + stderr

但是输出是:

stdout: test

stderr:

我希望输出能是这样的:

stdout: test
two

stderr:

有没有人能看出哪里出问题了?

相关问题:

1 个回答

2

问题在于,你正在向进程 echostdin 写入数据,而这个进程并没有从它的 stdin 读取数据。相反,你应该向像 bash 这样的进程写入数据,因为它会继续读取 stdin。如果你想实现你想要的效果,可以参考下面的代码:

import subprocess
process = subprocess.Popen("/bin/bash", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE);

process.stdin.write("echo \"test\"\n")
process.stdin.write("echo \"two\"\n")
process.stdin.flush()

stdout, stderr = process.communicate()
print "stdout: " + stdout
print "stderr: " + stderr

输出:

stdout: test
two

stderr: 

更新:可以查看 这个问题,来解决流式输出的问题。

撰写回答