【问题标题】:why does setting stderr=subprocess.STDOUT fix a subprocess.check_output call?为什么设置 stderr=subprocess.STDOUT 修复 subprocess.check_output 调用?
【发布时间】:2012-06-16 09:13:03
【问题描述】:

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

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

奇怪的是,当脚本被从 gammu-smsd 运行的 shell 脚本调用时,此行会失败。即使 CalledProcessError 对象的输出属性包含正确的输出,该行也会失败,并出现 CalledProcessError 异常“返回退出状态 2”。 shell 命令序列中唯一会给出这种错误状态的命令是 awk,状态 2 表示致命错误。

如果包含此行的 python 脚本由 cron、另一个 python 脚本或从命令行调用,则此行可以正常工作。我试图修复脚本的环境,我想这一定是问题所在。最后虽然我输入了stderr=subprocess.STDOUT,像这样:

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

这是一个调试措施,可帮助我确定是否有一些输出出现在 stderr 上。但在此之后脚本开始工作,即使是从 gammu-smsd 调用!为什么会这样?使用子流程时我要求将来参考...

【问题讨论】:

  • 检查 gammu-smsd 的 stderr 的去向。找到守护进程的 pid 然后执行ls -l /proc/XXXX/fd/[012]。我怀疑你会发现 fd 2 对一些不寻常的东西是开放的——也许是不可写的。

标签: python subprocess


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    相关资源
    最近更新 更多