0

这是我昨天匆忙结束的这个问题的后续行动

我有两个 Python 进程与从 stdin 读取的第二个进程一起传输。当馈线进程(将其输出写入标准输出)停止(例如被杀死)时,我希望下面的代码生成异常,正如其他人所建议的那样:

    while True:
    try:
        l = sys.stdin.readline()
        ## process l

    except Exception, e:
        ## handle exceptions

    except IOError, e:
        ## handle IO exceptions

        if e.errno == errno.EPIPE:
            ## handle EPIPE exceptions

但是,这不会发生。相反,sys.stdin.readline()只需返回一个空的l.

所以2个问题:

  • 当馈线进程死亡时,是否可以修改此代码以获取异常?
  • 我能以某种方式在第二个进程中找到进料器进程的进程 ID 吗?换句话说,如果我的管道是./step1.py | ./step2.py我想在 step2 中找到 step1 的进程 ID。我试过os.getppid()了,但返回的是运行 step2 的 bach 进程的 id,而不是 step1。

谢谢!

4

1 回答 1

0

首先,你为什么还坚持那个while True:结构?这是危险的,因为它可能导致无限循环。不for line in sys.stdin:适合你吗?

那么,如果你没有得到这个异常,那也不是一件坏事。这只是意味着“进料器”正确地关闭了管道的末端并且消费者注意到了它,这就是为什么 readline() 什么都不返回(一次?经常?它阻塞吗?又是一个无限循环吗?)。

我认为除了显式通信之外,没有一种简洁的方法可以确定刚刚通过管道连接的另一个进程的进程 ID。当然,操作系统会保留这些信息:https ://serverfault.com/questions/48330/how-can-i-get-more-info-on-open-pipes-show-in-proc-in-linux

我经常将数据通过管道传输到 Python 脚本中,这些脚本通过for line in sys.stdin. 这样,当进料过程终止并正确关闭管道的一侧时,循环就结束了。

于 2012-09-11T14:04:43.440 回答