subprocess执行命令,超时判断,数据量大被截断问题,进程中断。

2023-05-16

Python使用subprocess在本地 或者 其他远端机器上执行命令。

  1. 防止命令执行时间过长导致一直无法退出的问题。
  2. 防止命令输出内容过长,实际拿到的数据被截断,不全的问题
  • [ 新增 ] 进程中断,键盘ctrl C

备注: 对远端执行命令 需要提前免密,
参考:docker到宿主机免密

import subprocess
import time


def execute_cmd(cmd, remote=None, timeout=5):
    """
    @param cmd: 传入要执行的命令
    @param remote:  要远程执行的机器节点  host或者ip, 不传入remote认为是本地执行
    @param timeout: 命令自动结束的超市时间 默认5s
    @return: (退出码,命令正常输出,error信息)
    """
    t_beginning = int(time.time())
    try:
        if remote:
            ret = subprocess.Popen("ssh " + remote + " " + cmd, shell=True, close_fds=True,
                                   stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        else:
            ret = subprocess.Popen(cmd, shell=True, close_fds=True, stdin=subprocess.PIPE,
                                   stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    except Exception as e:
        # logger.error("cmd:{}, node:{}, err_msg:{}".format(cmd,node,e),exc_info=True)
        return 256, "", e
    if ret:
        stdout, stderr, task_break = "", "", False
        try:
	        while True:
	            # 判断是否命令是否结束
	            if ret.poll() is not None:
	                break
	            seconds_passed = int(time.time()) - t_beginning
	            # 超时判断,超时即退出并记录日志 
	            if timeout and seconds_passed > timeout:
	                ret.terminate()
	                # logger.error("task is break by timeout,cmd:{},timeout:{}".format(cmd, timeout))
	                task_break = True
	                break
	            time.sleep(0.1)
	            # 每次循环把存在pipe里面的数据读出来,防止数据量太多,pipe放不下,导致最后返回的stdout数据是被截断的
	            tmp_stdout, tmp_stderr = ret.communicate()
	            stdout += tmp_stdout
	            stderr += tmp_stderr
	        if task_break:
	            stderr = "task is break by timeout,cmd:{},timeout:{}".format(cmd, timeout)
	    except KeyboardInterrupt:
            print "\n进程已手动中断,pid:{}".format(ret.pid)
            return 256, "", ""
        finally:
            ret.stdout.close()
            ret.stderr.close()

        return ret.returncode, stdout, stderr
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

subprocess执行命令,超时判断,数据量大被截断问题,进程中断。 的相关文章

  • 我想检查Python的子进程是否成功或者是否发生错误

    我正在尝试使用 python 子进程创建代码 code print hey OK code print hey SyntaxError with open filename w as f f write code proc s Popen
  • 使用systemd启动的python无法启动子进程

    我在 virtualenv 中有一个 python 脚本 它是使用 systemd 启动的 Unit Description app After network target Service Type simple User user Gr
  • 子进程 check_output 返回非零退出状态 1

    这是我的Python代码 import subprocess subprocess check output ls shell True stderr subprocess STDOUT import subprocess subproce
  • 如何在 python 中运行这个 shell 脚本?

    我想从 python 程序运行 bash 脚本 该脚本有一个这样的命令 find type d exec bash c cd 0 gunzip c gz cut f 3 gt gt mydoc txt 通常我会运行一个子进程调用 例如 su
  • 如果在 bash 中通过管道传输,使用 subprocess 和 xclip 的 Python 脚本会挂起

    我有一个 python 脚本 需要将一些值输出到 stdin 并将另一个字符串复制到剪贴板 我正在使用该模块subprocess执行xclip效用通过Popen像这样的东西 clip py import subprocess from su
  • 尝试修复 tkinter GUI 冻结问题(使用线程)

    我有一个 Python 3 x 报告创建器 它的 I O 限制非常大 由于 SQL 而不是 Python 以至于主窗口将 锁定 minutes在创建报告时 所需要的只是能够在 GUI 锁定时使用标准窗口操作 移动 调整大小 最小化 关闭等
  • 子进程输出到 stdout 和 PIPE

    我正在使用subprocess像这样的模块 ping subprocess Popen fping exe 192 168 2 3 196 65 58 69 stdout PIPE output ping stdout readlines
  • Python:subprocess.Popen() 的第一个实例非常慢

    我确信我错过了一些简单的东西 但是当使用子进程模块时 启动第一个子进程需要等待一段非常长的时间 gt 10 秒 第二个在第一个之后不久开始 有没有什么办法解决这一问题 代码如下 编辑 要添加 HWAccess 在 proc py 中 链接一
  • 捕获子进程输出[重复]

    这个问题在这里已经有答案了 我了解到 在Python中执行命令时 我应该使用子进程 我想要实现的是通过 ffmpeg 对文件进行编码并观察程序输出 直到文件完成 Ffmpeg 将进度记录到 stderr 如果我尝试这样的事情 child s
  • 使用环境变量调用python中的子进程

    我正在尝试编写一个 python 脚本来使用 Plex 媒体扫描仪自动扫描 plex 的一部分 为此 我必须以运行 plex 的用户身份运行扫描仪 在本例中为 plex 并为其提供环境变量 LD LIBRARY PATH 我尝试过使用 su
  • 输入到 C++ 可执行 python 子进程

    我有一个 C 可执行文件 其中包含以下代码行 Do some calculations for int i 0 i
  • Python/Windows,防止子进程(外部程序)显示弹出窗口

    Python 2 7 操作系统 Windows 程序始终在 Windows 上运行 因此交叉兼容性不是问题 我被迫使用外部应用程序作为验证过程的一部分 并且在隐藏作为该外部程序的输出的弹出窗口时遇到了麻烦 基本上我这样做 args A pa
  • python子进程在引号前发送反斜杠

    我有一个字符串 它是一个应该在命令行中执行的框架命令 cmdToExecute TRAPTOOL a 字符串 ABC o 字符串 XYZ 我正在考虑该字符串具有应从命令提示符触发的整个命令 如果仔细查看字符串 cmdToExecute 您可
  • Windows 上的异步子进程

    首先 我要解决的总体问题比我在这里展示的要复杂一些 所以请不要告诉我 使用阻塞线程 因为如果没有公平 公平的重写 它就无法解决我的实际情况重构 我有几个不需要我修改的应用程序 它们从标准输入获取数据 并在发挥其魔力后将其输出到标准输出 我的
  • 如何在子进程期间和之后执行操作

    我有一个调用子程序的程序 当子程序使用 Popen 运行时 我需要禁用运行按钮并启用停止按钮 但是 由于Popen打开了一个新进程 因此程序完成后应该打印的内容会立即打印出来 我尝试添加self p communicate after Po
  • 从需要 stdin 的子进程实时打印 stdout

    这是后续这个问题 https stackoverflow com questions 17395243 printing stdout in realtime from subprocess 但如果我想传递一个参数stdin to subp
  • 使用子进程 PIPE 在 Python 脚本之间发送字符串

    我想在我的主 python 程序中使用子进程打开一个 Python 脚本 我希望这两个程序能够在运行时相互聊天 这样我就可以监视从属脚本中的活动 即我需要它们在彼此之间发送字符串 主程序将具有与此类似的功能 它将与从属脚本进行通信并监视 S
  • 与 Python 中的另一个命令行程序交互

    我需要编写一个 Python 脚本 它可以运行另一个命令行程序并与其标准输入和标准输出流交互 本质上 Python 脚本将从目标命令行程序中读取数据 通过写入其 stdin 进行智能响应 然后再次从程序中读取结果 它会重复执行此操作 我查看
  • 当我从本地计算机更改为虚拟主机时,从 python 脚本调用 pdftotext 不起作用

    我编写了一个小的 python 脚本来解析 提取 PDF 中的信息 我在本地机器上测试了它 我有 python 2 6 2 和 pdftotext 版本 0 12 4 我正在尝试在我的虚拟主机服务器 dreamhost 上运行它 它有 py
  • 使用 subprocess.Popen() 或 subprocess.check_call() 时程序卡住

    我想从 python 运行一个程序并找到它的内存使用情况 为此 我正在使用 l a out lt in txt gt out txt p subprocess Popen l shell False stdout subprocess PI

随机推荐

  • 视觉SLAM十四讲:运动方程

    SLAM xff1a 同时定位和建图 xff08 Simultaneous Localization and Mapping xff09 希望机器人从未知环境的未知地点出发 xff0c 在运动过程中通过重复观测到的地图特征 xff08 比如
  • NeRF简介及nerf-pytorch的使用

    NeRF全称为Neural Radiance Field 神经辐射场 是2020年发表的论文 xff0c 论文名字为 NeRF Representing Scenes as Neural Radiance Fields for View S
  • SLAM如何定位与建图

    SLAM xff1a 同时定位和建图 xff08 Simultaneous Localization and Mapping xff09 机器人从未知环境中的未知地点出发 xff0c 在运动过程中通过重复观测到的地图特征 xff08 比如
  • OpenMV——串口通信+发送中心位置

    串口通信 OpenMV本质还是一个单片机 xff0c 可以通过调用pyb中的UART使用串口通信 xff0c 注意发送的数据类型为字符串 xff0c 可以通过json dumps 进行字符串转换 span class token keywo
  • liunx下rpm包mysql安装脚本

    目录 文章目录 前言 一 mysqlshell安装脚本 二 xff0c mysql 配置文件 前言 liunx下mysql安装脚本shell脚本 采用的版本时 mysql 5 7 28 xff0c rpm安装方式 shell安装脚本 xff
  • setTimeout与setInterval的坑以及优缺点

    转自 xff1a setTimeout与setInterval的坑以及优缺点 找寻的千寻 博客园 setInterval和setTimeout的缺陷和优势分析 F ZERO F的博客 CSDN博客 settimeout缺点 说到setTim
  • 登录功能app端的建立与实现

    选择使用Android文件的一些主要包装命名搭建 1 Layout存放布局界面的地方 xff0c values是存放图片和颜色 字体等 2 manifests体现层 61 61 代码 3 执行界面打开 lt application lt 登
  • 麻将胡牌算法(遍历+剪枝)

    麻将胡牌算法 xff08 遍历 43 剪枝 xff09 简介麻将胡牌算法及代码1 方法引入2 类型定义2 1 牌定义2 2 牌特征定义 3 计算胡牌3 1 检测十三幺牌型3 2 检测七小对牌型3 3 检测普通牌型胡牌3 3 1 检测所有可能
  • 接口报错Missing grant type

    错误详情 xff1a 原因 xff1a 缺少表单参数 xff1a grant type 但如果传递了该参数依旧报错则说明传递的数据格式有误 xff0c 需要修改数据格式 解决方式 xff1a 第一步 xff1a 设置数据格式 Content
  • 如何关闭vue-element-admin中的格式化校验

    1 找到根目录下的 eslintignore文件 xff0c 如下 xff1a 2 将该文件内的内容全部替换为 xff0c 如图所示 xff1a 3 删除node modules和package lock json文件 xff0c 重新运行
  • D435i问题及解决

    提问连接 https support intelrealsense com hc en us requests new 1 使用realsense viewer时 xff0c 如果在3D模式下观看 xff0c 需要打开stereo modu
  • ubuntu磁盘空间不足解决办法

    df h后发现 目录下空间很少 点击左下角 搜索disk 点击 disk usage 看各个目录下占用的空间 xff0c 删除空间 2 在ubuntu 使用Windows的磁盘空间 发现 media liao 软件 下还有空间 xff0c
  • instant-ngp简介及NeRF的使用

    英伟达实验室开源的instant ngp全称为Instant Neural Graphics Primitives xff0c 源码地址为https github com NVlabs instant ngp xff0c 可用于快速的训练N
  • Bad owner or permissions on /home/cxhpc/.ssh/config

    实测解决方案 xff1a 进入 home cxhpc ssh sudo chmod 600 config
  • D3.js学习指北--第三章应用,冒泡排序的可视化

    D3学习指北 第三章应用 xff0c 冒泡排序的可视化 前言 本章前面已经讲了D3选择操作 xff0c 以及选择后返回的选择集的操作 那么我们应用一下 xff0c 利用d3 js写一个冒泡排序的可视化 首先第一步 xff1a 分析需求 一个
  • STM32(CubeMax)基础配置

    对于刚刚接触HAL库的小伙伴来说 xff0c 每次对于基础部分都需要查阅视频去进行操作 xff0c 本文就是通过STM32F103C8T6模块进行基础配置 xff0c 其他单片机基本与之一致 1 SYS配置如下图所示 2 RCC配置如下图所
  • (一)ROS学习之搭建realsense d435相机工作环境

    注 xff1a 本教程是在RealSense SDK和ROS Kinetic已正确安装的情况下进行的 一 realsense ros安装 1 Create a catkin workspace mkdir p realsense rosws
  • (三)ROS学习之gazebo加载异常或者加载缓慢完美解决

    1 升级gazebo版本 在终端运行以下指令 sudo sh c 39 echo 34 deb http packages osrfoundation org gazebo ubuntu stable 96 lsb release cs 9
  • Docker 实例

    1 创建两个容器实例 xff1a docker01 和 docker02 要求 xff1a 1 xff09 docker01 运行在cpu0上 2 xff09 docker02 运行在cpu1上 3 xff09 测试docker01 和 d
  • subprocess执行命令,超时判断,数据量大被截断问题,进程中断。

    Python使用subprocess在本地 或者 其他远端机器上执行命令 防止命令执行时间过长导致一直无法退出的问题 防止命令输出内容过长 xff0c 实际拿到的数据被截断 xff0c 不全的问题 新增 进程中断 xff0c 键盘ctrl