📜  python 运行子进程并获取输出 - Python (1)

📅  最后修改于: 2023-12-03 15:19:12.040000             🧑  作者: Mango

Python运行子进程并获取输出

有时候在Python程序中需要执行一些外部命令或者调用其他的脚本来完成一些功能。这时候我们可以使用Python的内置模块subprocess来运行子进程并获取输出。

subprocess模块概述

subprocess模块允许Python程序生成新的进程并与它们进行交互。它可以用来代替os.system和os.spawn系列函数。subprocess模块提供了更多选择来调用和控制进程,以及更安全的操作。

下面是subprocess模块的一些常见函数:

  • 启动新进程并等待其终止:subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
  • 返回进程输出:subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
  • 启动新进程并返回Popen对象:subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
subprocess.call

subprocess.call 函数可以启动一个新的子进程并等待其终止。它可以传递任何的命令行参数,并且能够在子进程执行期间获取它的标准输入、标准输出和标准错误流。

下面是一个输出当前目录列表的示例:

import subprocess

result = subprocess.call(["ls", "-l"])
print(result)

输出:

总用量 24
-rw-r--r--  1 user  staff  250  3  2 11:28 README.md
-rw-r--r--  1 user  staff  498 12 30  2020 main.py
-rw-r--r--  1 user  staff  239  3  8 20:28 test.py
0
  • subprocess.call 函数的参数是需要执行的命令,它们组成一个列表。
  • 如果命令执行成功将会返回0,否则会返回一个错误码。
subprocess.check_output

subprocess.check_output 函数执行给定的命令,然后将标准输出作为字节字符串返回。

下面是一个输出当前目录列表的示例:

import subprocess

result = subprocess.check_output(["ls", "-l"])
print(result)

输出:

b'total 24\n-rw-r--r--  1 user  staff  250  3  2 11:28 README.md\n-rw-r--r--  1 user  staff  498 12 30  2020 main.py\n-rw-r--r--  1 user  staff  239  3  8 20:28 test.py\n'
subprocess.Popen

subprocess.Popen 函数可以启动一个新的子进程,并在新的进程中执行指定的命令。它可以传递任何的命令行参数,并且能够在子进程执行期间获取它的标准输入、标准输出和标准错误流。

下面是一个输出当前目录列表的示例:

import subprocess

p = subprocess.Popen(["ls", "-l"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

out, err = p.communicate()

print(out.decode())

输出:

总用量 24
-rw-r--r--  1 user  staff  250  3  2 11:28 README.md
-rw-r--r--  1 user  staff  498 12 30  2020 main.py
-rw-r--r--  1 user  staff  239  3  8 20:28 test.py
  • subprocess.Popen 函数的参数是需要执行的命令,它们组成一个列表。
  • 通过设置stdout=subprocess.PIPEstderr=subprocess.PIPE,可以把Popen对象的标准输出和标准错误流储存到变量中。
  • p.communicate() 函数会等待子进程的结束,同时获取标准输出和标准错误流的内容。
小结

subprocess模块提供了三种运行子进程并获取输出的函数。使用这些函数,我们可以轻松地执行外部程序并从它们的标准输出和标准错误流中获取数据。注意,执外部命令是和操作系统相关的,不同的操作系统之间可能会有不同的命令和命令行参数。