Python 为什么设置stderr=subprocess.STDOUT会修复subprocess.check\u输出调用?

Python 为什么设置stderr=subprocess.STDOUT会修复subprocess.check\u输出调用?,python,subprocess,Python,Subprocess,我有一个运行在小型服务器上的python脚本,它以三种不同的方式被调用——从另一个python脚本中调用,由cron调用,或由gammu smsd(一个具有出色移动实用程序[gammu]的SMS守护进程)调用。该脚本用于维护,并包含以下用于测量系统上已用空间的乱码(这可能是在Python中实现的,但这很快又脏): reportdict['Used Space']=subprocess.check_输出([df/| tail-1 | awk'{print$5;}'),shell=True)[0:-

我有一个运行在小型服务器上的python脚本,它以三种不同的方式被调用——从另一个python脚本中调用,由cron调用,或由gammu smsd(一个具有出色移动实用程序[gammu]的SMS守护进程)调用。该脚本用于维护,并包含以下用于测量系统上已用空间的乱码(这可能是在Python中实现的,但这很快又脏):

reportdict['Used Space']=subprocess.check_输出([df/| tail-1 | awk'{print$5;}'),shell=True)[0:-1]

奇怪的是,只有当脚本被运行于gammu smsd的shell脚本调用时,这一行才会失败。即使CalledProcessError对象的output属性包含正确的输出,该行仍将失败,并显示CalledProcessError异常“returned exit status 2”。shell命令序列中唯一给出这种错误状态的命令是awk,状态2表示致命错误

如果包含这一行的python脚本由cron、另一个python脚本或从命令行调用,那么这一行就可以正常工作。我在试图修复脚本的环境时伤了脑筋,认为这一定是问题所在。最后,尽管我输入了stderr=subprocess.STDOUT,如下所示:

reportdict['Used Space']=subprocess.check_输出([df/| tail-1 | awk'{print$5;}'),stderr=subprocess.STDOUT,shell=True)[0:-1]


这是一个调试措施,可以帮助我判断stderr是否有输出。但在这之后,脚本开始工作,即使是从gammu smsd调用脚本!为什么会这样?我要求在使用子进程时提供将来的参考…

Gammu SMSD将在关闭所有文件描述符的情况下调用脚本(请参阅),这可能是失败的原因。

检查Gammu SMSD的标准程序将要去哪里。找到守护进程的pid,然后执行
ls-l/proc/XXXX/fd/[012]
。我怀疑你会发现FD2有一些不寻常的地方——可能是不可写的。