![](/img/trans.png)
[英]Python: How to prevent subprocesses from receiving CTRL-C / Control-C / SIGINT
[英]Python subprocesses (ffmpeg) only start once I Ctrl-C the program?
我正在嘗試使用Cygwin和Python 2.7並行運行一些ffmpeg命令。
這大致是我所擁有的:
import subprocess
processes = set()
commands = ["ffmpeg -i input.mp4 output.avi", "ffmpeg -i input2.mp4 output2.avi"]
for cmd in commands:
processes.add(
subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
)
for process in processes:
if process.poll() is None:
process.wait()
現在,一旦我在這段代碼的末尾,整個程序就會等待。 創建了所有ffmpeg進程,但它們處於空閑狀態,即使用0%CPU。 而Python程序一直在等待。 只有當我按下Ctrl-C時,它才會突然開始編碼。
我究竟做錯了什么? 我是否必須向流程“發送”一些內容才能啟動它們?
這只是猜測,但ffmpeg
通常會在stderr或stdout上產生大量狀態消息和輸出。 您正在使用subprocess.PIPE
將stdout和stderr重定向到管道,但是您從未讀取過這些內容,因此如果管道緩沖區已滿,則ffmpeg進程將在嘗試向其寫入數據時阻塞。
當你殺死父進程時,管道在它的末端被關閉,並且可能(我還沒有檢查)ffmpeg通過不再寫入管道來處理錯誤,因此解除阻塞並開始工作。
因此, os.devnull
在您的父進程中使用process.stdout
和process.stderr
管道,或者如果您不關心它, os.devnull
輸出重定向到os.devnull
。
除了@mata所說的,ffmpeg也可能會問你是否要覆蓋output.avi並等待你輸入“y”。 要強制覆蓋,請使用“-y”命令行選項( ffmpeg -i $input -y $output
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.