您的位置:

Python subprocess.popen示例:高效地运行和控制其他进程

Python subprocess模块让我们可以和操作系统进行交互,也可以让我们轻松地运行和控制其他进程。subprocess模块提供了一系列的函数和类,可以用来处理进程的创建、运行、输入、输出和信号等。其中,subprocess.Popen()是最强大和常用的函数之一,这个函数可以创建一个子进程,在新的进程中运行一个外部命令,把输入和输出连接到当前进程。比如,当需要执行其他编程语言的程序或者在Python中运行系统命令的时候,我们通常会使用subprocess模块。

一、subprocess模块中的常见方法

在学习subprocess.Popen()方法之前,我们先来了解一些subprocess模块中常见的函数和类。

1.subprocess.run()

subprocess.run()方法是Python 3.5以后新增的方法,它是subprocess模块的高层次的接口,可以用来代替Popen、call的组合使用,该方法可以获取子进程的输出以及运行结果代码,还可以设置timeout。

import subprocess

result = subprocess.run(["ls", "-l"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(result.returncode)
print(result.stdout.decode("utf-8"))
print(result.stderr.decode("utf-8"))

这个例子中,我们使用了subprocess.run()方法执行了Linux系统中的ls -l命令,并通过stdout和stderr输出了结果。这个例子中的returncode、stdout、stderr对象都是返回的bytes类型,需要使用decode()方法转换成字符串。

2.subprocess.call()

subprocess.call()方法是一个简单的方法,可以运行一个命令行命令,然后等待该命令完成。

import subprocess

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

这个例子中,我们使用了subprocess.call()方法执行了Linux系统中的ls -l命令,执行完之后,会返回值0。

3.subprocess.Popen()

subprocess.Popen()方法可以用来创建一个新的进程和子进程,可以把进程的输出与输入都连接到 Python,然后就可以和 Python 进行交互了。下面是一个例子。

import subprocess

process = subprocess.Popen(["ls", "-la"], stdout=subprocess.PIPE)
print(process.stdout.read())

这个例子中,我们使用了subprocess.Popen()方法执行了Linux系统中的ls -la命令,并通过stdout输出了结果。

二、subprocess.Popen()的常用参数

subprocess.Popen()方法会根据传入的参数启动一个新的进程,和Linux命令行一样,subprocess.Popen()也支持很多参数,下面是一些常用的参数:

1.args参数

args参数是一个字符串或者一个列表,指定需要执行的进程和传入的参数,如果是字符串类型,则需要把参数用空格隔开。

2.stdin、stdout和stderr参数

stdin、stdout和stderr参数分别代表子进程的标准输入、标准输出和标准错误输出。在Popen对象中,这三个属性本质是文件描述符,可以使用文件操作的方式进行修改(比如文件读写)。

3.shell参数

shell参数是一个布尔值参数,如果为True表示在Unix系统中使用shell或者Windows系统中使用cmd.exe的方式运行命令。

4.close_fds参数

close_fds参数用于关闭在创建子进程时不应该保持打开的文件描述符。文件描述符是一个整型数,指向内核中打开文件的一个记录。打开文件将会消耗掉系统资源,如果打开的文件过多,则会导致系统资源的浪费。该选项默认值为 True,建议不要更改。

三、subprocess.Popen()常见实战操作

1.子进程执行Linux命令行

在Python中执行Linux命令非常容易,下面是一个例子。

import subprocess

result = subprocess.Popen(["ls", "-l"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = result.communicate()
print(out.decode("utf-8"))
print(err.decode("utf-8"))

这个例子中,我们使用了Popen启动了一个子进程来执行ls -l命令,然后使用communicate()方法获取了它的输出结果和错误信息。这个例子演示了如何在Python中执行Linux命令,同时把输出和错误输出保存了下来。

2.打开一个文本文件进行读取和写入

下面是一个例子,演示了如何打开一个已经存在的文本文件,并把输出写入到该文件中。

import subprocess

with open("out.txt", "w") as outfile, open("err.txt", "w") as errfile:
    result = subprocess.Popen(["ls", "-l"], stdout=outfile, stderr=errfile)
    result.communicate()

这个例子中,我们用Popen创建了一个子进程来执行ls -l命令并把结果输出到out.txt文件中,然后把错误信息输出到err.txt文件中。

3.使用环境变量和管道

下面是一个例子,演示了如何使用环境变量和管道。

import subprocess

process = subprocess.Popen(["echo $HOME"], stdout=subprocess.PIPE, shell=True)
print(process.communicate()[0].decode("utf-8"))

这个例子中,我们用Popen创建了一个子进程来执行echo $HOME命令来获取$HOME环境变量的值,然后再使用communicate()方法获取它的输出结果。

总结

subprocess模块是Python中非常强大的模块之一,在使用Python语言编写脚本或应用程序时,经常要用到执行系统命令或调用第三方程序的情况,此时subprocess模块就非常有用。本文介绍了subprocess模块中的一些常用方法和参数,希望对读者有所帮助。