簡體   English   中英

如何有效地殺死Python中凍結的子進程?

[英]How to effectively kill a frozen subprocess in Python?

我正在處理一個比較奇怪的問題。

我已經為ffmpeg的舊版本編寫了Python包裝器(在Python 2.6.6中)。 問題是,給定一個非常特殊的視頻, ffmpeg停止正常工作(笨拙的輸出,完整的cpu使用率,沒有結束階段等),並且將python解釋器與之配合使用。

現在,如果我直接從終端運行ffmpeg並使用編碼選項,並將有問題的視頻作為輸入, ffmpeg不會立即響應Ctrl-c 我必須等待10秒鍾或更長時間,然后它退出並提示我。 但是,如果我改用“健康”視頻,它將僅打印“ Received signal 2: terminating. 並優雅地退出。

在python包裝器中,我使用p.kill()無效。 行為完全相同,也就是我必須等待10秒才能退出程序。 ffmpeg出現問題視頻時,如何立即停止播放?

請注意,如果執行兩次Ctrl-c無論如何我都會立即得到提示。

您如何執行FFmpeg子進程? 有很多方法可以啟動和監視Python中的進程。

我曾經處理這個確切的問題,因為我曾經為FFmpeg項目運行連續的自動化測試。 當我需要調試時,我將打印出程序認為與正在運行的FFmpeg進程相對應的PID。 然后,我將使用topps來驗證PID是否正確。 Linux和Mac OS X之間存在一些奇怪的問題,這些問題涉及傳遞給Python函數的外殼參數以及PID是否與FFmpeg進程或啟動FFmpeg進程的外殼相關。

另請參閱: 我寫的這篇老博客文章探討了這個問題以及眾多的答復

如果您使用的是Linux,則可以通過以下方式將其留在shell中:

subprocess.call( "kill -9 $(pidof ffmpeg)", shell=True )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM