【摸鱼笔记】subprocess,用子进程访问外部命令

subprocess是一个非常强大的模块,它能通过启动新进程的方式执行外部命令、访问系统Shell、管道等。

同时也能捕获这些新进程的输出和错误信息;

subprocess模块是Python的标准库中的一部分,支持 Python 3.5 及 3.5 以上版本;

3.5 以下版本需要额外安装;

执行外部命令

subprocess.run()

subprocess.run() 用于运行外部命令并等待其完成;

capture_output: 抓取输出;capture_output 参数 与 stdout,stderr 相关,

在不传入capture_output 和 stdout、stderr 的默认情况下,subprocess不会抓取 stdout 和 stderr,并且返回值对象里这两个属性为
None。

传入stdout=PIPE 和 stderr=PIPE 或者 stdout=PIPE、stderr=PIPE 其中一个,subprocess会对应着抓取它们;

如果希望抓取并将两个流合并在一起,可以使用 stdout=PIPE 和 stderr=STDOUT;

直接传入 capture_output=True,subprocess会stdout、stderr两个都抓取;

因为在capture_output=True时,内置的 Popen 对象将自动用 stdout=PIPE 和 stderr=PIPE 创建管道。

所以stdout 和 stderr 参数不应当与 capture_output 同时传入。

check: 返回状态检查;check 参数和子进程运行退出状态码有关

当子进程退出时 return code(状态码) 不为 0,则会触发 CalledProcessError异常;

退出的 return code 会保存到 CalledProcessError.returncode 属性中,

如果 stdout、stderr有被抓取,则 stdout 和 stderr 也会在 CalledProcessError.stdout 和 CalledProcessError.stderr属性里;

timeout :超时时间,如果传入 timeout,并且进程花费的时间超出 timeout,则会触发TimeoutExpired异常;

text: 功能类似 universal_newlines 参数,

默认不传入的情况下,subprocess.run() 返回的stdout、stderr是字节类型,

当text或者universal_newlines为True,stdout、stderr输出是字符串类型;

cwd: 指定 subprocess 子进程工作路径;

input :向子进程传入的参数,可选参数,以下是官方文档的解释

input 参数将被传递给 Popen.communicate() 以及子进程的 stdin。它必须是一个字节序列;

如果指定了 encoding 或 errors 或者将 text 设置为 True,那么也可以是一个字符串。

当使用此参数时,在创建内部 Popen 对象时将自动带上 stdin=PIPE,并且不能再手动指定 stdin 参数。

一般使用

import subprocess

complete = subprocess.run(["ipconfig", "/all"],
                          capture_output=True,
                          text=True)
print(complete.stdout)

拼接参数

如果命令需要接受参数,可以将它们作为列表的一部分传递给subprocess.run()或subprocess.Popen()。

例如,要将文件名作为参数传递给命令,可以这样做:

import subprocess

sub_path = "data_lake"
complete = subprocess.run(["dir", sub_path],
                          shell=True,
                          capture_output=True,
                          text=True,
                          cwd="E:\\VsCodeProjects\\")
print(complete.stdout)

指定路径

使用cwd参数来指定执行外部命令的工作目录。例如,要在特定目录中执行命令,可以这样做:

import subprocess

complete = subprocess.run(["dir"],
                          shell=True,
                          capture_output=True,
                          text=True,
                          cwd="E:\\VsCodeProjects\\")
print(complete.stdout)

使用Shell命令

默认情况下,subprocess不会使用Shell来执行命令。这是出于安全考虑,以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

The_Singing_Towers

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值