2017-03-08 3 views
1

pythonスクリプトを作成してビデオファイルをバッチ処理し、CLIバインディングを作成しました。リポジトリhereを見つけることができます。cli関数でpythonのサブプロセスを使用すると、コマンドラインが破損する

(ビデオ処理は計算量が多いので)私はusing Python's subprocess module to achieve some parallelizationです。

私のようにコマンドラインから私のスクリプトを呼び出しています:

repositorg vidproc -p "-crf 16 -c:a copy -filter:v 'crop=1080:1080:420:0'" nd750_a00{80..86}.MOV 

、それが正常に動作します。しかし、それが実行された後、それは私の端末を壊す。私はもはや私が何を入力しているか見ることはできませんが、それでも端末に送られます。これは私が数回現在の行を殺害した後、lsを入力してEnterキーを押すの例である:あなたが見ることができるように

[email protected] ~/data/cameras/nd750/a $ ^C 
[email protected] ~/data/cameras/nd750/a $ ^C 
[email protected] ~/data/cameras/nd750/a $ ^C 
[email protected] ~/data/cameras/nd750/a $ ^C 
[email protected] ~/data/cameras/nd750/a $ nd750_a0000.mkv nd750_a0016.mkv nd750_a0032.mkv nd750_a0048.mkv nd750_a0064.mkv nd750_a0079.MOV 
nd750_a0001.mkv nd750_a0017.mkv nd750_a0033.mkv nd750_a0049.mkv nd750_a0065.mkv nd750_a0080.mkv 
nd750_a0002.mkv nd750_a0018.mkv nd750_a0034.mkv nd750_a0050.mkv nd750_a0066.mkv nd750_a0080.MOV 
nd750_a0003.mkv nd750_a0019.mkv nd750_a0035.mkv nd750_a0051.mkv nd750_a0067.mkv nd750_a0081.mkv 
nd750_a0004.mkv nd750_a0020.mkv nd750_a0036.mkv nd750_a0052.mkv nd750_a0068.mkv nd750_a0081.MOV 
nd750_a0005.mkv nd750_a0021.mkv nd750_a0037.mkv nd750_a0053.mkv nd750_a0069.mkv nd750_a0082.mkv 
nd750_a0006.mkv nd750_a0022.mkv nd750_a0038.mkv nd750_a0054.mkv nd750_a0070.mkv nd750_a0082.MOV 
nd750_a0007.mkv nd750_a0023.mkv nd750_a0039.mkv nd750_a0055.mkv nd750_a0071.mkv nd750_a0083.mkv 
nd750_a0008.mkv nd750_a0024.mkv nd750_a0040.mkv nd750_a0056.mkv nd750_a0072.mkv nd750_a0083.MOV 
nd750_a0009.mkv nd750_a0025.mkv nd750_a0041.mkv nd750_a0057.mkv nd750_a0073.mkv nd750_a0084.mkv 
nd750_a0010.mkv nd750_a0026.mkv nd750_a0042.mkv nd750_a0058.mkv nd750_a0074.mkv nd750_a0084.MOV 
nd750_a0011.mkv nd750_a0027.mkv nd750_a0043.mkv nd750_a0059.mkv nd750_a0075.mkv nd750_a0085.mkv 
nd750_a0012.mkv nd750_a0028.mkv nd750_a0044.mkv nd750_a0060.mkv nd750_a0076.mkv nd750_a0085.MOV 
nd750_a0013.mkv nd750_a0029.mkv nd750_a0045.mkv nd750_a0061.mkv nd750_a0077.mkv nd750_a0086.mkv 
nd750_a0014.mkv nd750_a0030.mkv nd750_a0046.mkv nd750_a0062.mkv nd750_a0078.mkv nd750_a0086.MOV 
nd750_a0015.mkv nd750_a0031.mkv nd750_a0047.mkv nd750_a0063.mkv nd750_a0079.mkv 

は、lsが印刷されていませんが、その出力はとインラインで始まるものの、ありますプロンプト...

は、私が疑問に思って:

  • はここで何が起こっているの?
  • この問題が発生したら、端末を修正するにはどうすればよいですか?
  • スクリプトが端末を破損しないようにするにはどうすればよいですか?

答えて

0

私は問題が正確であることを理解していません(この回答にその情報を追加する編集を受け入れることを嬉しく思っています)。しかし、スクリプトをクリーンプロンプトに戻すプロセスを終了する必要があるようです。 to my function

while None in [p.poll() for p in processes]: 
    time.sleep(0.5) 
#We need to explicitly terminate the master process here, as otherwise the shell "hangs" and the user needs to press enter to return to a new prompt. 
os.system('kill %d' % os.getpid()) 
0

一部のプロセスでは、echoがオフになっている場合があります。これは、sttyコマンドを使用して確認できます。 、

$ stty -echo 

を次に4回入力打つタイプstty

$ stty 
speed 38400 baud; line = 0; 
-brkint ixoff -imaxbel iutf8 

それがオフになって入った場合:通常、これは何が起こるかです

$ $ $ $ $ speed 38400 baud; line = 0; 
-brkint ixoff -imaxbel iutf8 
-echo 

に戻ってそれを有効にするには、単に呼び出しますstty echo

0

キーボード割り込みをキャプチャし、きれいに処理します。 https://docs.python.org/3/library/exceptions.html#KeyboardInterrupt

マルチプロセッシング環境では、割り込みがどこでも(ワーカーまたは親スレッド内で)発生する可能性があることを考慮する必要があります。また、親を終了する前にすべてのワーカーを強制終了する必要があります。

+0

この機能は中断されたときではなく、実行が終了した後に発生していました。 – TheChymera

関連する問題