声明:这是个标题党,如果你执意想用os.popen做到控制台输出重定向,这篇文章中并没有答案,如果你对os.popen没有那么强烈的执念,请继续看
前段时间写代码使用os.popen时,遇到一个问题:执行的命令有可能会运行失败,虽然在代码中增加了异常处理,但是对于功能的要求是,不能在控制台打印出来报错信息,附上使用os.popen的情况:
# -*- coding: utf-8 -*-
import os
if __name__ == '__main__':
CMD = "adb -H 1.2.3.5 devices" # ip未知,执行肯定会报错
prco = os.popen(CMD, mode="r", buffering=-1)
outputStr = str(prco.read())
print("output: " + outputStr)
控制台输出结果是这样的:
** Cannot start server on remote host
error: can't connect to 1.2.3.5:7305: cannot connect to 1.2.3.5:7305: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 (10060)
output: List of devices attached
可以看到前两行输出部署预期想要的,那要怎么才能不让命令中的stderr输出到控制台呢?网上搜了下,大把的解决方法都是写个脚本,让popen调用这个脚本,然后用输出重定向的方式去解决这个问题。但是!不!够!优!雅!
有没有一种方式可以直接过滤掉stderr呢?答案是肯定的,我们可以通过subprocess.Popen方法完美解决这个问题
# -*- coding: utf-8 -*-
import subprocess
import io
if __name__ == '__main__':
CMD = "adb -H 1.2.3.5 devices" # ip未知,执行肯定会报错
proc = subprocess.Popen(CMD, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=-1)
proc.wait()
stream_stdout = io.TextIOWrapper(proc.stdout, encoding='utf-8')
stream_stderr = io.TextIOWrapper(proc.stderr, encoding='utf-8')
str_stdout = str(stream_stdout.read())
str_stderr = str(stream_stderr.read())
print("stdout: " + str_stdout)
print("stderr: " + str_stderr)
控制台输出结果:
stdout: List of devices attached
stderr: ** Cannot start server on remote host
error: can't connect to 1.2.3.5:7305: cannot connect to 1.2.3.5:7305: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 (10060)
这样就能捕捉并指定输出stderr的内容了,顺便说一句,这里也可以将Popen中的stderr参数值从subprocess.PIPE换成subprocess.DEVNULL,不过这样就不会得到stderr的输出了。
os.popen和subprocess.Popen在功能上都是对控制台进行读写操作的,其中的区别可参见我的另一篇文章:https://blog.csdn.net/Ls4034/article/details/89386857
声明:这是个标题党,如果你执意想用os.popen做到控制台输出重定向,这篇文章中并没有答案,如果你对os.popen没有那么强烈的执念,请继续看前段时间写代码使用os.popen时,遇到一个问题:执行的命令有可能会运行失败,虽然在代码中增加了异常处理,但是对于功能的要求是,不能在控制台打印出来报错信息,附上使用os.popen的情况:# -*- coding: utf-8 -*-im...
自从工作了就好久没发博客,还是出来冒个泡=。=
前段时间写的一个项目需要用python的subprocess.Popen大量调用某shell命令,运行到一定量级之后就会产生内存溢出,造成大量线程阻塞,然后就会造成([Errno 24] Too many open files)这个异常。
网上有人说是close_fds=True这个参数在python2.x默认没打开,这个参数可以关闭文件描述
subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/output/error 管道,并获取它们的返回(状态)码;
本文主要举例说明其中Popen的使用:
subprocess.Popen():
在一些复杂场景中,我们需要将一个进程的执行输出作为另一个进程的输入。在另一些场景中,我们需要先进入到某个输入环境,然后再执行一系列的指令等。这个...
subprocess.Popen(cmd, close_fds=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
ValueError: close_fds is not supported on Windows platforms if you redirect stdin/stdout/stderr
在windo
python 中 subprocess.Popen 总结
subprocess的目的就是启动一个新的进程并且与之通信。
subprocess模块中只定义了一个类: Popen。可以使用Popen来创建进程,并与进程进行复杂的交互。它的构造函数如下:
subprocess.Popen(args,
bufsize=0,
executable=None,
stdin=None,