nwnusun

   ::  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

python 执行shell命令,且执行完后将shell端的输出返回

subprocess

import subprocess

# 要执行的命令
command = "ls -lrt"

# 执行命令
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

# 等待命令执行完成
process.wait()

# 获取命令的输出和错误信息
output = process.stdout.read()
error = process.stderr.read()

# 将输出和错误信息解码为字符串
output = output.decode(encoding="gbk")
error = error.decode(encoding="gbk")

# 返回命令的输出和错误信息
result = {"output": output, "error": error}
print(result)

​ 在这段代码中,我们使用 subprocess.run() 方法执行了 ls -l 命令,并将结果保存在 output 变量中。然后,我们调用了 stdout.decode() 方法将输出解码为字符串,并打印结果。
注意,在调用 subprocess.run() 时,我们传入了两个参数:shell=True 和 stdout=subprocess.PIPE。shell=True 表示要使用 shell 来执行命令,而 stdout=subprocess.PIPE 则表示将命令的标准输出保存在 output.stdout 中。

process.wait()

process.wait() 方法用来等待一个子进程执行完毕。它会阻塞当前线程,直到子进程结束。

例如,如果我们使用如下代码来启动一个子进程:

import subprocess

# 启动一个子进程,执行命令 'sleep 5'
process = subprocess.Popen(['sleep', '5'])

# 等待子进程执行完毕
process.wait()

在这个例子中,我们启动了一个子进程,并让它执行 'sleep 5' 命令。这个命令会让子进程挂起 5 秒钟。接着,我们使用 process.wait() 方法等待子进程执行完毕。这个方法会阻塞当前线程,直到子进程结束,然后才会继续执行后面的代码。

process.communicate(timeout=20)

​ 如果想设置执行超时时间,需要使用

output, error = process.communicate(timeout=20)

这段代码用来启动一个子进程,并与该进程通信。

process.communicate() 方法会在子进程执行完毕后返回两个值:子进程的输出和错误信息。

这段代码中的 timeout 参数指定了最长等待时间,单位是秒。如果在规定时间内子进程还未执行完毕,那么将会抛出一个 TimeoutExpired 异常。

例如,如果我们使用如下代码来执行一个子进程:

import subprocess

# 启动一个子进程,执行命令 'sleep 5'
process = subprocess.Popen(['sleep', '5'])

# 等待子进程执行完毕,最长等待时间为 20 秒
try:
    output, error = process.communicate(timeout=20)
except subprocess.TimeoutExpired:
    print('TimeoutExpired')

os.system()

import os

# 要执行的命令
command = "ls -l"

# 执行命令
output = os.system(command)

# 输出结果
print(output)

​ os.system() 方法执行了 ls -l 命令,并将结果保存在 output 变量中。然后,我们打印了 output 的值。
虽然使用 os.system() 方法可以执行 shell 命令,但它没有 subprocess.run() 方法那么强大。例如,os.system() 方法无法将命令的标准输出保存在变量中,因此无法对输出进行进一步的处理。
因此,如果您需要对命令的输出进行进一步的处理,建议使用 subprocess 模块。如果只需要执行命令,则可以使用 os.system() 方法。

sh

# 安装sh库
!pip install sh

from sh import ls

# 执行ls -l命令
output = ls("-l")

# 输出结果
print(output)

pexpect

# 安装pexpect库
!pip install pexpect

import pexpect

# 要执行的命令
command = "ls -l"

# 执行命令
output = pexpect.run(command)

# 输出结果
print(output)

​ 如果要从性能的角度考虑,推荐使用 subprocess 模块来执行 shell 命令。相比于其他方法,subprocess 模块能够更快地执行命令,并且可以将命令的标准输出保存在变量中,方便进一步的处理。

posted on 2022-12-10 05:02  匿名者nwnu  阅读(6689)  评论(0编辑  收藏  举报