首页 > 解决方案 > 在变量中捕获在终端中运行的命令的输出

问题描述

我正在尝试捕获从运行到变量中的 python 脚本中获得的所有数据。我在脚本中从用户那里获取了一些输入,我想从头到尾捕获所有内容。

它几乎与此类似:运行 shell 命令并捕获输出

但这再次使用脚本中的子进程来获取输出。

我想要的是这样的:

当我在终端中运行 ls -l 时,我希望我的脚本捕获 ls -l 的输出

如果我写:

p2 = subprocess.Popen('ls' ,'-l',stdout= subprocess.PIPE).communicate()[0])

在我的脚本中,这将执行脚本两次。

当我在终端中运行 ls -l 以在 p2 中捕获时,预期的输出是捕获所有数据。

标签: pythonsubprocess

解决方案


您可以使用pexpect轻松打开 PTY 并记录它显示的所有内容:

#!/usr/bin/env python3
import pexpect
import io

print("-- Running the program")
p = pexpect.spawn("./foo.py")
p.logfile_read = io.BytesIO()
p.interact();

print("-- Program exited. Here is the log:")
log = p.logfile_read.getvalue().decode("utf-8")
print(log)

这是一个foo.py

#!/usr/bin/env python3
name=input("Enter name: ")
print("Hello " + name)

从终端运行它时会发生以下情况:

$ ./foo.py
Enter name: World
Hello World

当您从日志记录脚本运行它时,会发生以下情况:

$ ./log.py
-- Running the program
Enter name: World
Hello World
-- Program exited. Here is the log:
Enter name: World
Hello World

推荐阅读