sence:python中使用subprocess.Popen(cmd, stdout=sys.STDOUT, stderr=sys.STDERR, shell=True) ,stdout, stderr 为None.
在错误中执行是无法捕获 stderr的内容,后面将上面的改为 subprocess.Popen(cmd, stdout=PIPE, stderr=PIPE, shell=True),发现是可以拿到 stderr, 但是会遇到大量任务hanging,造成线上事故。
为此特意查询subprocess的一些参数的说明。
stdin stdout stderr 如果这些参数为 PIPE, 此时会为一个文件句柄,而传入其他(例如 sys.stdout 、None 等)的则为None
正如这里介绍的一样,subprocess 。
而使用 PIPE,却导致程序 hanging。一般来说不推荐使用 stdout=PIPE stderr=PIPE,这样会导致一个死锁,子进程会将输入的内容输入到 pipe,直到操作系统从buffer中读取出输入的内容。
查询手册可以看到确实是这个问题 Refernce
Warning This will deadlock when using stdout=PIPE and/or stderr=PIPE and the child process generates enough output to a pipe such that it blocks waiting for the OS pipe buffer to accept more data. Use communicate() to avoid that....