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

python之执行shell命令的更多相关文章

  1. python中执行shell命令的几个方法小结(转载)

    转载:http://www.jb51.net/article/55327.htm python中执行shell命令的几个方法小结 投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014- ...

  2. python中执行shell命令的几个方法小结

    原文 http://www.jb51.net/article/55327.htm 最近有个需求就是页面上执行shell命令,第一想到的就是os.system, os.system('cat /proc ...

  3. C++/Php/Python 语言执行shell命令

    编程中经常需要在程序中使用shell命令来简化程序,这里记录一下. 1. C++ 执行shell命令 #include <iostream> #include <string> ...

  4. python中执行shell命令行read结果

    +++++++++++++++++++++++++++++ python执行shell命令1 os.system 可以返回运行shell命令状态,同时会在终端输出运行结果 例如 ipython中运行如 ...

  5. python(6)-执行shell命令

    可以执行shell命令的相关模块和函数有: os.system os.spawn* os.popen*          --废弃 popen2.*           --废弃 commands.* ...

  6. 「Python」6种python中执行shell命令方法

    用Python调用Shell命令有如下几种方式: 第一种: os.system("The command you want"). 这个调用相当直接,且是同步进行的,程序需要阻塞并等 ...

  7. python中执行shell命令的几个方法

    1.os.system() a=os.system("df -hT | awk 'NR==3{print $(NF-1)}'") 该命令会在页面上打印输出结果,但变量不会保留结果, ...

  8. python批量执行shell命令

    [root@master ~]# cat a.py #!/usr/bin/python # -*- coding:UTF- -*- import subprocess def fun(): subpr ...

  9. python中执行shell命令

    查看输出结果 import os output = os.popen('cat 6018_gap_5_predict/solusion2/solusion2_0-1.txt | wc -l') pri ...

  10. python中执行shell的两种方法总结

    这篇文章主要介绍了python中执行shell的两种方法,有两种方法可以在Python中执行SHELL程序,方法一是使用Python的commands包,方法二则是使用subprocess包,这两个包 ...

随机推荐

  1. lbs 地理位置

    lbs 地理位置 https://caorong.github.io/2018/05/04/lbs/ https://www.cnblogs.com/lbser/p/3310455.html http ...

  2. SRE 必备知识 - Kafka 探秘之零拷贝技术

    如果你了解过 Kafka,那么它用到的一个性能优化技术可能会引起你的注意 -- 操作系统的零拷贝(zero-copy)优化. 零拷贝操作可以避免对数据的非必要拷贝,当然,并非是说完全没有拷贝. 在 K ...

  3. Ubuntu 设置中文

    首先安装中文语言包: sudo apt install -y language-pack-zh-hans 接下来在 ~/.zshrc 或 ~/.bashrc 中添加如下内容: export \ LAN ...

  4. 安装 Google Cloud CLI(gcloud)

    安装 Ubuntu # 更新软件包索引 sudo apt update # 安装辅助工具 sudo apt install apt-transport-https ca-certificates gn ...

  5. linux修改limits.conf不生效

    正常情况下, /etc/security/limits.conf 的改动,重新登录就可以生效, 我遇到的问题最后的解决方案是重启虚拟机解决了,也参考了很多网上的文章,整理记录一下 一.修改方法 1.临 ...

  6. 【笔记】Tapable源码解析图以及webpack怎样实现一个插件plugin

    Tapable源码解析图,如图所示: 一个webpack plugin由一下几个步骤组成: 一个JavaScript类函数. 在函数原型 (prototype)中定义一个注入compiler对象的ap ...

  7. SpringCloud入门(二)服务间调用和案例

    一.微服务拆分注意事项微服务拆分注意事项:1.单一职责:不同微服务,不要重复开发相同业务2.数据独立:不要访问其它微服务的数据库3.面向服务:将自己的业务暴露为接口,供其它微服务调用 1.微服务需要根 ...

  8. Asp.net core 学习笔记之 Microsoft Graph API

    早年如果我们要读写用户得 outlook 内容是比较麻烦的, 要用许多 smtp 之类的方式. 现在终于是有了 http 级的 API 可以 call 了. 不仅仅是 outlook, calenda ...

  9. C++ 模板(函数模板与类模板)

    模板 模板介绍 C++提供了函数模板(function template).所谓函数模板.实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表.这个通用函数就称为函数模板. ...

  10. 大模型应用开发初探 : 快速直观感受RAG

    大家好,我是Edison. 上一篇,我们了解了什么如何让一些开源小参数量模型具有函数调用的能力.这一篇,我们来快速了解下RAG(检索增强生成)并通过一个简单的DEMO来直观感受一下它的作用. RAG是 ...