无名阁,只为技术而生。流水不争先,争的是滔滔不绝。

(python subprocess) Python模块学习之subprocess详解 Python中Subprocess模块 全网首发(图文详解1)

前沿技术 Micheal 7个月前 (06-08) 84次浏览 已收录 扫描二维码

(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)

喜欢 (0)
[]
分享 (0)
关于作者:
流水不争先,争的是滔滔不绝