迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

Python 子进程捕获输出

作者:迹忆客 最近更新:2023/06/15 浏览次数:

本文的主要目的是演示如何在 Python 中捕获、存储和显示子进程的输出。


Python 子进程捕获输出

Subprocess 是一个内置的 Python 模块,预装了 Python 安装文件。 它用于通过创建新进程来运行新代码和应用程序,其中给定任务(根据传递的内容)与其进程分开执行。

使用 Subprocess 的主要优点之一是它允许我们从当前编写的程序中启动新程序。

运行此类程序的一个示例是,如果您想从 Git 存储库克隆某个项目,或者可能执行执行其特定任务的 C++ 编译器二进制文件。

假设我们要执行一个用 C++ 编写的程序,其代码如下。

#include <iostream>

using namespace std;

int main()
{
  int rows = 5, count = 0, count1 = 0, k = 0;
  for(int i = 1; i <= rows; ++i)
  {
    for(int space = 1; space <= rows-i; ++space)
    {
      cout << "  ";
      ++count;

    }

  while(k != 2*i-1)
  {
    if (count <= rows-1)
    {
      cout << i+k << " ";
      ++count;

    }

    else
    {
      ++count1;
      cout << i+k-2*count1 << " ";

    }
    ++k;

  }
  count1 = count = k = 0;
  cout << endl;

  }

return 0;
}

哪个打开独立执行给出以下输出:

pyramid

现在我们执行使用 Python 编写的程序的编译二进制文件。

import subprocess

p2 = subprocess.Popen("program\\pyramid.exe")
print(p2)

输出:

<Popen: returncode: None args: '....\\program\\pyramid.exe>
        1
      2 3 2
    3 4 5 4 3
  4 5 6 7 6 5 4
5 6 7 8 9 8 7 6 5

如上面的代码所示,很明显,我们没有获取字符串,而是获取了 Popen 的实例,这不是理想的情况,因为我们需要字符串的输出来对输出或其他内容执行处理 目的。

必须注意的是,我们看到的金字塔输出不是打印名为 p2 的变量的结果,而是使用 Popen 执行的程序的输出。

可以通过多种方式解决此问题,下面将介绍其中的一些方式。


方法 1:使用 check_output 在 Python 中捕获子进程的输出

考虑以下代码:

from subprocess import check_output

out = check_output(["program\\pyramid.exe"])

print(out)

输出:

b'        1 \r\n      2 3 2 \r\n    3 4 5 4 3 \r\n  4 5 6 7 6 5 4 \r\n5 6 7 8 9 8 7 6 5 \r\n'

输出为字节形式,可以使用 decode() 函数轻松将其转换为字符串。

print(out.decode('utf-8'))

输出:

pyramid

这是我们在名为 out 的字符串变量中所需的输出。

check_output() 函数运行我们想要的命令,并以字节串的形式返回执行程序的命令输出。

然后我们可以使用 decode() 方法将字节字符串转换为普通字符串。 decode() 参数的编码参数可能因输出类型而异。

在我们的例子中,它是 utf-8,但它可能因程序和操作系统而异。


方法 2:使用 Popen.communicate 在 Python 中捕获子进程的输出

考虑以下代码:

import subprocess

pipe = subprocess.Popen("\\program\\pyramid.exe", stdout=subprocess.PIPE)

text = pipe.communicate()[0]

print(text)

输出:

b'        1 \r\n      2 3 2 \r\n    3 4 5 4 3 \r\n  4 5 6 7 6 5 4 \r\n5 6 7 8 9 8 7 6 5 \r\n'

像以前一样,返回一个字节字符串,可以使用 decode() 函数轻松返回。

print(text.decode('utf-8'))

输出:

pyramid

除了使用 check_output,我们还可以使用 Popen.communicate() 方法,check_output 的主要优点之一是它允许将 stdout 和 stderr 重定向到我们想要的变量。

Popen 返回 stdout 和 stderr 的元组,因此当您访问 [0] 时,您只是在获取 stdout。 你也可以做文本,err = pipe.communicate(),然后文本就会有需要的东西。

就像 check_output 一样,Popen.communicate() 也返回一个字节字符串,在将兼容且合适的编码方案传递给 decode 方法后,可以使用 decode 方法轻松将其转换为普通字符串。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Python 子进程在运行时读取标准输出

发布时间:2023/06/15 浏览次数:127 分类:Python

本文的主要目的是演示如何读取在 Python 中执行的子进程的标准输出。Python 子进程在运行时读取标准输出 与许多其他内置模块一样,Subprocess 也是一个内置模块,预装了“正常”Python 安装。

使用 Python 获取 CPU 数量

发布时间:2023/06/15 浏览次数:173 分类:Python

CPU 可以包含单核或多核。 单核只处理一个进程,而多核同时处理多个进程。本篇文章将介绍使用 Python 程序查找 CPU 内核总数的不同方法。使用 multiprocessing 模块获取 Python 中的 CPU 数量

Python获取CPU温度

发布时间:2023/06/15 浏览次数:111 分类:Python

本文的主要目的是演示如何借助 Python 中的 pythonnet 库读取和显示 CPU 温度。Python获取CPU温度

Python 从网页中提取表格

发布时间:2023/06/15 浏览次数:50 分类:Python

本文的主要目的是演示如何在 Python 中使用 Pandas 和 lxml 从网页中提取表格。Python 从网页中提取表格

Python Antigravity 模块的用途

发布时间:2023/06/15 浏览次数:72 分类:Python

一个这样的 Python 彩蛋是反重力模块。让我们看看 Antigravity 模块做了什么,并看看其他几个例子。

不使用 pip 安装 Python 包

发布时间:2023/06/15 浏览次数:189 分类:Python

在本文中,我们将学习如何在 Python 中安装没有 pip 的库。 我们还将学习如何使用 conda 命令在 Python 中安装包。不使用 pip 命令安装 Python 库

在代码中安装 Python 模块

发布时间:2023/06/15 浏览次数:72 分类:Python

理想情况下,从 pip 安装 Python 模块非常方便; 为此,您必须在活动终端中输入 pip install module-name ,然后就完成了。

将 Gnuplot 与 Python 结合使用

发布时间:2023/06/15 浏览次数:131 分类:Python

Gnuplot 是一个开源命令行驱动的交互式数据绘图软件。 如果您是 Gnuplot 用户并且想在 Python 中使用它,那么您可以借助两个包 Gnuplot 和 PyGnuplot 轻松地做到这一点。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便