(python subprocess) Python模块学习之subprocess详解
Python中的subprocess模块是用于在新进程中执行外部命令和程序的接口。通过subprocess模块,你可以启动新的应用程序、与它们的输入输出流进行交互以及获取执行结果。
下面详细解释如何使用subprocess模块:
引入模块
首先,需要引入subprocess模块到你的Python脚本中:
import subprocess
基本使用: subprocess.run()
subprocess模块的run()
函数是执行外部命令的推荐方式,因为既简单又安全。它返回一个CompletedProcess
对象。
例子:执行ls
命令(列出目录内容)
# 执行命令并等待命令执行完成
completed_process = subprocess.run(["ls", "-l"], text=True, capture_output=True)
# 打印执行结果
print("Status Code:", completed_process.returncode)
print("Output:", completed_process.stdout)
在上面的代码中:
["ls", "-l"]
是执行的命令,以参数列表的形式提供。text=True
表示以文本模式处理输入输出,等同于universal_newlines=True
。capture_output=True
表示捕获stdout和stderr的输出。
捕获错误输出
当运行的外部命令出错时,你可能需要获取错误输出。可以使用stderr
参数来实现。
# 执行一个错误的命令
completed_process = subprocess.run(["ls", "--bogus"], text=True, stderr=subprocess.PIPE)
print("Error Message:", completed_process.stderr)
在这个例子中,因为命令执行错误,stderr
参数被用来捕获错误信息。
进程通信:subprocess.Popen
如果你需要更详细地控制子进程,比如进行复杂的输入输出操作,你可以使用subprocess.Popen
类。
例子:通过Python将文本写入wc(词频统计)命令
# 使用Popen创建子进程
proc = subprocess.Popen(["wc"], stdin=subprocess.PIPE, text=True, stdout=subprocess.PIPE)
# 向子进程的stdin写入数据
stdout, stderr = proc.communicate('hello world')
# 打印子进程的stdout
print("Output:", stdout)
注意communicate()
方法是用来与子进程通信的。它发送输入给子进程的stdin,然后获取输出和错误输出。
异常处理
在使用subprocess
模块时,经常需要处理命令执行失败的情况。可以捕获CalledProcessError
异常。
try:
subprocess.run(["false"], check=True)
except subprocess.CalledProcessError as e:
print("命令执行出错,错误代码:", e.returncode)
当check=True
设置时,如果命令执行返回非0状态码,run()
方法将抛出CalledProcessError
异常。
以上概述了subprocess模块的一些基础用法,这个模块还有很多高级功能,比如timeout控制、使用shell模式等,可以根据你的具体需求学习相应的部分。不过,在使用subprocess模块时要特别小心,尤其是在传递输入和shell=True的时候,以避免潜在的安全风险。
(java运行环境下载) Java SE Development Kit(JDK1.8) 8u401 java8 64位 java运行库正式版 Java SE开发包(JDK1.8) 全网首发(图文详解1)
(uni.navigateback) uniapp中uni.navigateBack返回后刷新页面数据的实现 在uniApp中实现uni.navigateBack返回后刷新页面数据 全网首发(图文详解1)