2011-06-27 91 views
12

端接ffmpeg子後後不可見,在終端得到弄糟 - 鍵入的字符都看不見!輸入仍然可以執行,但可以執行命令,但鍵盤輸入不會回顯給終端。終端文本變成終止子

發出shell命令reset(從IPython中內或!reset)使一切恢復正常,所以解決方法的問題,呼籲os.system('reset')的腳本中。

我試過的其他東西:import curses; curses.initscr()在產卵子過程之前和curses.endwin()終止之後,這有效,但打破了其他的東西。另一個可能相關的問題是,在產生子進程之後,交互式終端變得遲緩並且有時無法捕獲鍵入的字符。

產卵過程的代碼如下所示:

with open('/tmp/stdout.log', 'w') as o: 
    with open('/tmp/stderr.log', 'w') as e: 
     proc = subprocess.Popen([args], stdout=o, stderr=e) 

後來又停止它:

proc.terminate() 
proc.communicate() 

可能是錯誤怎麼回事?

+0

我想它有不便做'標準輸出= O,標準錯誤= e' – warvariuc

+0

在Django的runserver當它重新加載存在同樣的問題。 –

+0

我已將stdout和stderr重定向到os.devnull,問題仍然存在 – wim

回答

11

更改腳本,以便沒有使用proc.terminate()。你可以用

proc.send_signal(signal.SIGINT) 
    proc.wait() 

這允許的ffmpeg寫任何轉義序列,它需要恢復終端的機會更禮貌地停止ffmpeg子。


編輯:發現later-還有一個小竅門,使ffmpeg表現得更好Popen是提供它subprocess.PIPEopen(os.devnull)stdin手柄。否則,它似乎試圖從父母的標準輸入中獲得輸入,這可能會導致終端的奇怪行爲。正在運行的ffmpeg進程正在偵聽'?'和stdin上的'q'輸入。

+0

將stdin設置爲'open(os.devnull)'作品 – mononoke

2

你與子溝通?在這種情況下,我會使用pexpect,這種設置非常簡單,也許您必須等待命令完成?即

p = subprocess.Popen(argv, stdout=o, stderr=e) 
p.wait() 
if p.returncode != 0: 
     print("problems") 

這就是我在dvd2h264劇本我寫了一段時間後使用,從未有過任何問題,但我不重定向標準輸入/標準錯誤到TMPFILES ..

+0

沒有真正的互動交流 - 我編碼實時流從捕獲卡在管道,並且當腳本接收(無論是從鍵盤,或從另一個腳本)一SIGINT的POPEN實例終止。我也嘗試過使用proc.send_signal(signal.SIGINT),並且在檢查proc.returncode之前等待半秒。如果它仍然是None,那麼我用terminate()來終止它(我認爲它使用了SIGTERM) – wim

+0

好的,你能提取失敗的代碼,即製作一個我可以嘗試的「hallo fail」示例?失敗終端的原因必須是將轉義序列寫入stdout,但爲了看看會發生什麼情況,產生錯誤的小代碼片段將有所幫助。 – bjarneh

+0

謝謝,我已經看到了使用轉義序列可以用彩色文本編寫的例子,所以你給了我一些想法來嘗試 - 也許我需要'unsescape'回純文本。可惜我不能爲您提供始終如一失敗的例子,因爲它似乎是一個間歇性的問題,你有可能會需要相同的採集卡重現它 – wim

1

​​爲我工作。它重置設置使回聲隱形。