【Python】在代码中执行终端命令并获取输出和运行状态

文章介绍了Python中使用os库的os.system和os.popen方法以及subprocess库的run和Popen函数来执行命令行操作,并获取输出和状态。os.system只执行命令但不返回输出,os.popen能返回执行结果但可能存在编码问题。subprocess.run会等待命令执行完毕,而subprocess.Popen允许异步执行并检查执行状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0 前言

  在Python编程过程中,我们可能会遇到需要在终端命令行执行某个命令并获取其输出的操作,我们首先想到可能就是C语言中的system("pause");语句,确实,python当中也有类似的命令,同时,为了满足进一步的需求,比如判断指令是否执行完毕或者是得到执行输出的内容。

1 os库

1.1 os.system

  这个指令仅在终端运行该指令,不能获取命令行返回的信息,但是它会在输出终端显示命令执行的输出。

# test.py
print("Hello")

# run.py
import os
cmd = "python test.py"
os.system(cmd)

# output:
Hello

这个操作是会堵塞程序执行

1.2 os.popen

  os.popen不仅可以执行命令,还可以返回执行结果

# test.py
print("Hello")

# run.py
import os
cmd = "python test.py"
out = os.popen(cmd)
print(out.readlines())

# output:
['Hello\n']

  不过,这个库需要注意的是,如果命令执行输出有中文掺杂,最好不要使用这个命令,它的编码可能会存在一定问题。

2 subprocess库

  subprocess库主要功能是输入输出流,在VS Code中打开它的说明,如下图所示。

在这里插入图片描述

从图中可以看出这个库的主要两个函数接口是runPopen,往下翻还可以找到它其他的一些比较老的函数。这里介绍这两种主要函数的使用。

2.1 subprocess.run

  根据上面的subprocess的说明,可以知道,run函数可以在命令行运行一个指令,并等待它运行完毕,并返回一个“已结束进程的实例”。这个函数的参数比较多,这里简单介绍几个。

在这里插入图片描述

args :  需要执行的命令行(cmd命令行,不是shell)
stdout :  命令执行完的输出,可以设置为一个文件对象,或者是它自带的类PIPE
stderr :  命令行执行完的报错信息,参数设置和stdout一样
encoding :  编码设置,因为它默认的输出都是bytes,十六进制的,加上这个可以转换成字符串格式,
			如果不加上这个也可以在获取输出时decode一下,变成字符串。
shell :  这个似乎不是指定在powershell中执行,但一般会加上 shell = True

  下面是一个简单的实例

# test.py
print("Hello")

# run.py
import subprocess
cmd = "python test.py"
b = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE).stdout
print(b.decode('gbk')) 

  需要注意,这里要使用gbk的编码方式,这个可能是和subprocess这个库有关,它内部默认使用的终端是cmd终端,编码方式有些特殊。如果使用默认的utf-8解码会出现报错 ‘utf-8’ codec can’t decode byte 0xb9 in position 0: invalid start byte ,具体原理和解决方式可以参考这篇博客

2.2 subprocess.Popen

  Popen函数和run函数非常相似,但是它执行命令时是新开一个进程,而不是像run函数一样堵塞执行,因此用Popen可以实现同时执行多条指令(但也不能太多)。此外Popen的返回值可以调用wait函数来查看指令执行状态,判断是否执行完毕。

3 参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

记录无知岁月

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

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

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

打赏作者

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

抵扣说明:

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

余额充值