【问题标题】:Python - Is stdout always "available"?Python - 标准输出是否总是“可用”?
【发布时间】:2014-12-03 16:08:56
【问题描述】:

我编写了一个 API,用户可以将 sql 查询的输出定向到:

1> Excel(ExcelOut 类)
2> CSV(CSVOut 类)
3> 标准输出(StdOut 类)

对于前 2 种输出类型,我希望用户向我提供一个文件位置,然后 API 检查该位置是否存在,也就是参数验证
对于标准输出,我想知道是否需要任何验证?也就是说,当代码运行时,API 的 用户(开发人员)是否不知道 sys.stdout 不“可用”

【问题讨论】:

    标签: python linux io


    【解决方案1】:

    stdout 不可写的原因有很多。以下是一些示例:

    # 1. Run with stdout explicitly closed:
    $ ./yourscript >&- 
    
    # 2. Run in the background and then closing the terminal
    $ ./yourscript & exit
    
    # 3. No space on the device (/dev/full simulates this for testing):
    $ ./yourscript > /dev/full
    
    # 4. Run with a pipe that closes immediately:
    $ ./yourscript | true
    
    # 5. Run with a pipe that closes after the first 10 lines:
    $ ./yourscript | head -n 10
    

    在写入时,每个错误都包含在 Python IOError 中,并且 Errno 设置为:

    1. EBADF (Bad file descriptor)

    2. EIO (Input/output error)

    3. ENOSPC (No space left on device)

    4. EPIPE (Broken pipe)

    5. 前几次 write 调用会成功,然后 EPIPE 就像 #4 一样(换句话说,工作一次并不意味着总是工作)。

    在开始写入之前尝试确定标准输出是否有效很少有用(可以使用例如os.fstat 完成基本检查)。大多数程序应该假设它是可用的,并优雅地处理故障。

    【讨论】:

    • 感谢您的意见。 1、2、4 和 5 似乎是故意不让标准输出可用。也许我应该在我的问题中明确指出,但我正在寻找用户不知道 sys.stdout 不可用的场景(原因是我希望用户仍然是开发人员)。
    • 哦,还有一个问题,如果标准输出是文本终端,全盘会影响标准输出吗?如果这是一个愚蠢的问题,我深表歉意,但我的印象是,将其打印到屏幕上不会占用任何磁盘空间
    • @name_masked 看起来是经过深思熟虑的,因为它是重现相同条件的最短方法。我们可以search github 来处理 1. 2 的真实情况,在使用 xinetd 和 cgi 脚本时很容易发生。 4 和 5 都可能是因为 ./yourscript | gawk -F , '{print $1}' > file 看起来很无辜。
    • @name_masked 在写入 tty 时,您不太可能直接获得 ENOSPC。但是,ENOSPC 可能会导致终端仿真器失败并返回 EIO。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 2016-06-13
    相关资源
    最近更新 更多