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
模块能够更快地执行命令,并且可以将命令的标准输出保存在变量中,方便进一步的处理。