捕获命令输出,在终端中的变量中运行

时间:2019-10-22 23:28:36

标签: python subprocess

我正在尝试捕获我从运行到变量的python脚本获取的所有数据。我从脚本中的用户那里获取了一些输入,并且想要捕获从开始到结束的所有内容。

几乎与此类似:Running shell command and capturing the output

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

我想要的是这样的:

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

如果我写:

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

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

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

2 个答案:

答案 0 :(得分:0)

如果您想避免显式使用subprocess.Popen()的所有麻烦,那就去os.popen("command").read()-它在幕后运行前者,在我看来,p2 = os.popen("ls -l").read()的结果看起来像恰到好处。

答案 1 :(得分:0)

您可以使用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