Python中的断管在Ubuntu Linux上不会生成异常
这是我昨天匆忙结束的后续行动 我有两个Python进程,第二个进程从stdin读取。当feeder进程(将其输出写入stdout)停止(例如被终止)时,我希望下面的代码生成异常,正如其他人所建议的那样: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
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吗?换句话说,如果我的管道是
我想在step2中找到step1的进程ID。我尝试了/step1.py |/step2.py
,但它返回运行步骤2而不是步骤1的bach进程的idos.getppid()
谢谢 首先,为什么您在True:构造时仍然坚持使用
?这是危险的,因为它可能导致无休止的循环。sys.stdin:
中的行的不适合您吗
那么,如果你没有得到这个异常,这不是一件坏事。这仅仅意味着“进料器”正确地关闭了它的管道末端,消费者注意到了它,这就是为什么readline()什么也不返回(一次?经常?它会阻塞吗?是否又有一个无止境的循环?)
我认为,除了显式地进行通信之外,没有一种简单的方法可以确定通过管道连接的另一个进程的进程ID。当然,操作系统会保存以下信息:
我经常通过管道将数据传输到Python脚本中,这些脚本通过sys.stdin中的行读取数据。这样,当进料过程结束时,循环刚好结束,并正确关闭管道的一侧。好的,我用“for”替换了“while”,在一些简单的测试中,它工作了,这非常好。终止feeder进程仍然没有产生任何异常,第二个脚本刚刚完成。我认为这应该行得通,尽管我正在尝试思考一个案例,当feeder进程出现某种短暂的停顿时,会导致第二个脚本结束——如果可能的话,我需要避免这种行为。可能需要找到获取管道进程信息的方法,以检查馈线是否仍处于活动状态。使用SIGKILL强制终止馈线进程,即,Kill-9$PROCESSID
,以观察消费者在这种情况下的行为。这是可能发生的最糟糕的情况。是的,这正是我一直在做的。加上包含空行的cat
文件的转储。