Python中的断管在Ubuntu Linux上不会生成异常

Python中的断管在Ubuntu Linux上不会生成异常,python,exception,pipe,Python,Exception,Pipe,这是我昨天匆忙结束的后续行动 我有两个Python进程,第二个进程从stdin读取。当feeder进程(将其输出写入stdout)停止(例如被终止)时,我希望下面的代码生成异常,正如其他人所建议的那样: while True: try: l = sys.stdin.readline() ## process l except Exception, e: ## handle exceptions except IO

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

我有两个Python进程,第二个进程从stdin读取。当feeder进程(将其输出写入stdout)停止(例如被终止)时,我希望下面的代码生成异常,正如其他人所建议的那样:

    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

因此,有两个问题:

  • 当进料器进程终止时,是否可以修改此代码以获得异常
  • 我能在第二个流程中找到进料器流程的流程ID吗?换句话说,如果我的管道是
    /step1.py |/step2.py
    我想在step2中找到step1的进程ID。我尝试了
    os.getppid()
    ,但它返回运行步骤2而不是步骤1的bach进程的id

谢谢

首先,为什么您在True:构造时仍然坚持使用
?这是危险的,因为它可能导致无休止的循环。sys.stdin:
中的行的
不适合您吗

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

我认为,除了显式地进行通信之外,没有一种简单的方法可以确定通过管道连接的另一个进程的进程ID。当然,操作系统会保存以下信息:


我经常通过管道将数据传输到Python脚本中,这些脚本通过sys.stdin中的
行读取数据。这样,当进料过程结束时,循环刚好结束,并正确关闭管道的一侧。

好的,我用“for”替换了“while”,在一些简单的测试中,它工作了,这非常好。终止feeder进程仍然没有产生任何异常,第二个脚本刚刚完成。我认为这应该行得通,尽管我正在尝试思考一个案例,当feeder进程出现某种短暂的停顿时,会导致第二个脚本结束——如果可能的话,我需要避免这种行为。可能需要找到获取管道进程信息的方法,以检查馈线是否仍处于活动状态。使用SIGKILL强制终止馈线进程,即,
Kill-9$PROCESSID
,以观察消费者在这种情况下的行为。这是可能发生的最糟糕的情况。是的,这正是我一直在做的。加上包含空行的
cat
文件的转储。