2017-06-15 9 views
1

抑制サブプロセスのPythonウィンドウでコンソール出力(Tkinterの)アプリ

pyInstallerの-w -F script.py

を使用して作られました:

def ffmpeg_command(sec): 
    cmd1 = ['ffmpeg', '-f','gdigrab','-framerate',config.get('FFMPEG_Settings','Framerate'),'-i','desktop',gen_filename_from_timestamp_and_extension()] 


    proc = subprocess.Popen(cmd1,stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) 

    duration = sec 
    sleeptime = 0 
    while proc.poll() is None and sleeptime < duration: 
     # Wait for the specific duration or for the process to finish 
     time.sleep(1) 
     sleeptime += 1 

    proc.terminate() 

上記のコードは、Tkinterボタンが押され、このコードがボタンクリックハンドラから呼び出されたときに実行されます。

私の問題は、私がexeを実行しているときにffmpegを実行しないということです。私がするコマンドを設定した場合 はしかし、:FFMPEGを実行しない

proc = subprocess.Popen(cmd1) 

、私は私が欲しかったムービーファイルを取得しますが、私はFFMPEGのためのコンソールウィンドウを見ることができます。だから私は映画の中でコンソールウィンドウを取得することになります。 (私はボタンクリックハンドラでTkinterウィンドウを最小限に抑えます)

私の質問はどうやってコンソールウィンドウを抑制し、私が望むようにFFMPEGを実行するのですか? 私は次のスレッドを見て、それを動作させることができませんでした: How to hide output of subprocess in Python 2.7Open a program with python minimized or hidden

は@Stackと@eryksun

+0

proc = subprocess.Popen(cmd1、stdout = subprocess.DEVNULL、stderr = subprocess.DEVNULL)にパラメータ** shell = True **を追加してみてください。 – Stack

+0

@Stack - コメントありがとうございます。私はそれを修正しようとしました: 'proc = subprocess.Popen(cmd1、shell = True、stdout = subprocess.DEVNULL、stderr = subprocess.DEVNULL)'しかし、私はまだ同じ結果を得ています:( –

+0

Windows 'stdin = subprocess.DEVNULL'を介して置き換えますが、' NUL'デバイスにハンドルを設定しても、コンソールの割り当てが妨げられたり隠されたりすることはありません 'shell = True 'を指定すると、 'STARTUPINFO'で隠されますが、できるだけシェルを避けて、コンソールには全く接続しない方が簡単です。' DETACHED_PROCESS = 8'を定義し、 'creationflags = DETACHED_PROCESS'を使用してください。 – eryksun

答えて

1

はありがとうありがとう! 私は、次のコードに変更:

startupinfo = subprocess.STARTUPINFO() 
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW 
startupinfo.wShowWindow = subprocess.SW_HIDE 
cmd1 = ['ffmpeg', '-f','gdigrab','-framerate',config.get('FFMPEG_Settings','Framerate'),'-i','desktop',gen_filename_from_timestamp_and_extension()] 
proc = subprocess.Popen(cmd1,stdin=subprocess.DEVNULL,stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,startupinfo=startupinfo) 

は私が望んで達成。 実際、@eryksunが示唆しているように、出力のリダイレクトだけでは出力されませんでした。出力をすべて抑制するには、stdin=subprocess.DEVNULLも使用する必要がありました。

コンソールウィンドウは表示されたままですが、上記のようにstartupinfoを設定すると、コンソールウィンドウが非表示になりました。 時間が経過するとFFMPEGが消滅することも確認されています。

ありがとうございました!

+0

あなたは' shell = True'を保っていると言いますが、上記のコードでは使用していません。シェルを必要としません。私はまだ 'DETACHED_PROCESS'作成フラグでコンソールを作成しないようにWindowsに指示することをお勧めします。 – eryksun

関連する問題