如何使用python子流程将子流程o/p捕获到另一个fd

如何使用python子流程将子流程o/p捕获到另一个fd,python,Python,我有一个shell命令行,将数据输出到文件描述符,它不同于stdout或stderr 当我尝试时: p1 = subprocess.Popen("some cmdline", shell=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE) a,b = p1.communicate() 我发现a和b都是空的,在运行上面的两个python命令时,有一些o/p(日志,我正在尝试捕获)发送到控制台 我知道我可能必须将o/p从shell cmd

我有一个shell命令行,将数据输出到文件描述符,它不同于
stdout
stderr

当我尝试时:

p1 = subprocess.Popen("some cmdline", shell=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
a,b = p1.communicate()
我发现a和b都是空的,在运行上面的两个python命令时,有一些o/p(日志,我正在尝试捕获)发送到控制台

我知道我可能必须将o/p从shell cmdline重定向到stdout或stderr,但shell cmdline发送日志的fd每次都会发生更改


我的问题是如何将上面shell命令行中的o/p捕获到a和/或b中

这对我来说就像预期的那样。你在用什么操作系统?在unix上,可以尝试在shell命令“2>&1”中添加重定向。您也可以尝试一些变体,看看它是否有不同的效果。stderr=subprocess.PIPE或shell=False会发生什么情况[您可能需要将命令行拆分为一个参数列表。]@StevenD.Majewski我在问题文本中添加了一些重点。请看一看。shell命令行发送到的fd、数据不是1或2,而是其他内容,并且会随着每次调用而更改。请尝试使用“close_fds=True”,查看这是否会在每次调用时更改不同的fd。(也许是父母的fds造成了不同。)。尝试添加:“3>&14>&15>&1”,看看会发生什么。(可能需要更多,但如果close_fds=True changes behavior,则可能不需要。)如果您负担得起,请使用更高级别的包装器,如
sh
模块。@PauloScardine我会试试,谢谢。