使用subprocess.Popen执行bash
我正在尝试用Python为bash会话写一个封装器。首先,我做的就是试着启动一个bash进程,然后读取它的输出,像这样:
from subprocess import Popen, PIPE
bash = Popen("bash", stdin = PIPE, stdout = PIPE, stderr = PIPE)
prompt = bash.stdout.read()
bash.stdin.write("ls\n")
ls_output = bash.stdout.read()
但是这样并不奏效。首先,在创建进程后读取bash的标准输出时失败了,当我尝试写入标准输入时,还出现了“管道破裂”的错误。我到底哪里做错了?
再澄清一下,我并不是想通过bash运行一个单独的命令然后获取它的输出,而是想让一个bash会话在某个进程中运行,并且我可以通过管道与它进行通信。
4 个回答
0
你为什么不直接使用 cmd模块 和 subprocess.Popen(shell = True) 呢?
0
read()
这个调用是阻塞的,也就是说它会读取第一个命令的输出,然后停在那里,因为后续的数据可能还会到来(也就是说,bash
还在运行)。如果你想进行非阻塞的读取,可以参考Python中对子进程管道的非阻塞读取。
3
这个可以用:
import subprocess
command = "ls"
p = subprocess.Popen(command, shell=True, bufsize=0, stdout=subprocess.PIPE, universal_newlines=True)
p.wait()
output = p.stdout.read()
p.stdout.close()