try : # 执行外部shell命令, 输出结果输出管道 p = subprocess.Popen(cmd, shell= True , stdout=subprocess.PIPE, stderr=subprocess.STDOUT) p.wait() # 从标准输出读出shell命令的输出结果 #rt = p.stdout.read().decode() # 以换行符拆分数据,并去掉换行符号存入列表 rt_list = rt.strip().split( '\n' ) except Exception as e: if (DEBUG): print(traceback.format_exc()) return rt_list

子进程产生一些数据,他们会被buffer起来,当buffer满了,会写到子进程的标准输出和标准错误输出,这些东西通过管道发送给父进程。当管道满了之后,子进程就停止写入,于是就卡住了,及时取走管道的输出就不会出现阻塞了

但是本人此处采取的是临时文件接收子进程输出,由于临时文件是建立在磁盘上的,没有size的限制,并且文件被close后,相应的磁盘上的空间也会被释放掉。

已改进的代码

import tempfile
# 启用子进程执行外部shell命令
def __subprocess(self,cmd):
    try:
        # 得到一个临时文件对象, 调用close后,此文件从磁盘删除
        out_temp = tempfile.TemporaryFile(mode='w+')
        # 获取临时文件的文件号
        fileno = out_temp.fileno()
        # 执行外部shell命令, 输出结果存入临时文件中
        p = subprocess.Popen(cmd, shell=True, stdout=fileno, stderr=fileno) 
        p.wait()
        # 从临时文件读出shell命令的输出结果
        out_temp.seek(0)
        rt = out_temp.read()
        # 以换行符拆分数据,并去掉换行符号存入列表
        rt_list = rt.strip().split('\n')
    except Exception as e:
        if(DEBUG):
            print(traceback.format_exc())
    finally:
        if out_temp:
            out_temp.close()
    return rt_list
记录一下踩过的坑,希望碰到此问题的人能看到,平时对 subprocess . Popen ()了解不多,就用来执行命令,都没出现什么问题,此次开发中,使用 subprocess . Popen ()执行的命令是数据备份,当数据量过大时,一直不能结束http会话, 返回 前端响应,然后就各种搜资料解决,最后找到原因。 p = subprocess . Popen (cmd, shell =True, close_fds=Tr...
subprocess . Popen () subprocess 模块中基本的进程创建和管理由 Popen 类来处理. subprocess . popen 是用来替代os. popen 的. from subprocess import Popen , PIPE p = Pop... class AnomalyResult: def GET(self): p = subprocess . Popen ([' python ', 'analysis/xx_analyze.py'], stdout= subprocess .PIPE) sub_stdout = p.stdout.read().decode('gbk') for i in sub_stdout.split('\n
本来收集整理网络上相关资料后整理: 从 python 2.4版本开始,可以用 subprocess 这个模块来产生 子进程 ,并连接到 子进程 的标准输入/输出/错误中去,还可以得到 子进程 返回 值。 subprocess 意在替代其他几个老的模块或者函数,比如:os.system os.spawn* os. popen * popen 2.* commands.* 一、 subprocess ...
python subprocess . Popen 阻塞 问题分析 在用 subprocess . Popen 对会生成大规模前台输出的指令进行运行时会产生 阻塞 问题,在某一时刻就会导致无法及时输出脚本的运行情况。用system.os一定程度上可以简单粗暴的解决这种问题,然而由于需要在jenkens上进行部署,在jenkens上输出的console中,system.os中的脚本输出展示优先级高于 python 本身的输出,导致所看到的输出结果顺序错乱,因此还是要想办法投奔回 subprocess . Popen 的怀抱。 解决方法参考
python subprocess . Popen 总结 subprocess 的目的就是启动一个新的进程并且与之通信。 subprocess 模块中只定义了一个类: Popen 。可以使用 Popen 来创建进程,并与进程进行复杂的交互。它的构造函数如下: subprocess . Popen (args, bufsize=0, executable=None, stdin=None,
自从工作了就好久没发博客,还是出来冒个泡=。=  前段时间写的一个项目需要用 python subprocess . Popen 大量调用某 shell 命令,运行到一定量级之后就会产生内存溢出,造成大量线程 阻塞 ,然后就会造成([Errno 24] Too many open files)这个异常。  网上有人说是close_fds=True这个参数在 python 2.x默认没打开,这个参数可以关闭文件描述