try
:
p = subprocess.Popen(cmd, shell=
True
, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
p.wait()
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
def __subprocess(self,cmd):
try:
out_temp = tempfile.TemporaryFile(mode='w+')
fileno = out_temp.fileno()
p = subprocess.Popen(cmd, shell=True, stdout=fileno, stderr=fileno)
p.wait()
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默认没打开,这个参数可以关闭文件描述