2012-02-14 4 views
1

Pythonプログラムの実行中にユーザーが自分のプログラムのUI(tkinterを使って構築されたもの)を引き続き使用できるように外部プログラムを呼び出す方法を知りたい。プログラムは、ユーザーがコピーするファイルを選択するのを待っているので、外部プログラムが実行されている間もファイルを選択してコピーできるはずです。外部プログラムはAdobe Flash Playerです。Pythonで外部プログラムを同時に実行する

おそらく、私はスレッド「ワーカー」クラスを持っているという事実のためにいくつかの問題がありますか?コピー中に進行状況バーが更新されます。 Flash Playerが開いていても、プログレスバーを更新したいです。

  1. 私はsubprocessモジュールを試しました。プログラムは実行されますが、Flash Playerが終了するまでユーザーがUIを使用できなくなります。また、コピーはまだバックグラウンドで発生しているようですが、Flash Playerが終了するまでプログレスバーは更新されません。

    def run_clip(): 
        flash_filepath = "C:\\path\\to\\file.exe" 
    
        # halts UI until flash player is closed... 
        subprocess.call([flash_filepath])    
    
  2. 次に、私は(私はとにかくのPython 3を使用した)concurrent.futuresモジュールを使用してみました。私はまだアプリケーションを呼び出すためにsubprocessを使用しているので、このコードが上記の例とまったく同じように動作することは驚くことではありません。

    def run_clip(): 
        with futures.ProcessPoolExecutor() as executor: 
        flash_filepath = "C:\\path\\to\\file.exe" 
        executor.submit(subprocess.call(animate_filepath)) 
    

subprocessを使用して、問題の嘘をしていますか?もしそうなら、外部プログラムを呼び出すより良い方法がありますか?前もって感謝します。

答えて

7

subprocessモジュールの詳細については、おおよそPopenです。同時にバックグラウンド・プロセスを実行するには

、あなたはsubprocess.Popenを使用する必要があります。

import subprocess 

child = subprocess.Popen([flash_filepath]) 
# At this point, the child process runs concurrently with the current process 

# Do other stuff 

# And later on, when you need the subprocess to finish or whatever 
result = child.wait() 

あなたはまた、(この場合はchildで)Popen -objectの部材を介してサブプロセスは、入力および出力ストリームと対話することができます。

+0

偉大な '子=サブプロセス.Popen'はトリックを行います。私はモジュールのメソッドにもっと慣れていなければなりませんが、 'wait'を使うことについての情報をありがとう。 – gary

関連する問題