首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >python subprocess.run如果您重定向stdout/stderr,则会退出错误而不是正常工作

python subprocess.run如果您重定向stdout/stderr,则会退出错误而不是正常工作
EN

Stack Overflow用户
提问于 2018-07-09 02:34:46
回答 1查看 95关注 0票数 0
代码语言:javascript
复制
#!/usr/bin/env python3

import subprocess
import os

if False:
    # create log file.
    kfd = os.open( 'kk.log', os.O_WRONLY )

    # redirect stdout & err to a log file.
    os.close(1)
    os.dup(kfd)
    os.close(2)
    os.dup(kfd)

subprocess.run([ "echo", "hello world"], check=True )

% ./kk.py
hello world
% 

上面的方法运行良好,但如果您尝试编辑文件,并将False替换为true:

代码语言:javascript
复制
% ./kk.py
% more kk.log
Traceback (most recent call last):
File "./kk.py", line 16, in <module>
  subprocess.run([ "echo", "hello world"], check=True )
File "/usr/lib/python3.6/subprocess.py", line 418, in run
  output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['echo', 'hello world']' returned 

非零退出状态1。%

我们得不到输出,进程错误就会退出...我希望它能正常工作,给kk.log写信。

EN

回答 1

Stack Overflow用户

发布于 2018-07-09 03:06:21

你可能想说这样的话:

代码语言:javascript
复制
#!/usr/bin/env python3

import subprocess
import os

if True:
    # create log file.
    kfd = os.open( 'kk.log', os.O_WRONLY | os.O_CREAT )

    # redirect stdout & err to a log file.
    os.dup2(kfd, 1)
    os.dup2(kfd, 2)

subprocess.run([ "echo", "hello world"], check=True )

注意os.dup2的用法。这有两个原因。首先,得到的文件描述符是可继承的。您的echo实际上没有打开的stdout/-err,因此失败了(您可以在shell中运行以下命令,在关闭标准输出的情况下执行echo,以检查其行为:/bin/echo hello world 1>&-)。还要注意,如果我关闭了stdout ( 1 ),那么最低描述符(以及os.dup的结果)可能并不总是正确的。有人可能在运行脚本之前关闭了您的stdin (0) (stderr也是如此)。

文件描述符继承的背景故事在PEP-446中。

我还添加了os.O_CREAT,因为我尝试重现您的问题的第一次失败是不存在的kk.log。

不用说,除非你尝试在操作系统中使用接口(也许是一个练习),否则我想你通常应该坚持使用subprocess本身。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51234966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档