ポータブルブラウザがシャットダウンされたときに閉じるポータブルPydocサーバーをセットアップするにはどうすればよいですか?
質問
Chromiumポータブル、Firefoxポータブル、Python 3で構成されるフラッシュドライブにポータブル環境をセットアップしました。Pydocサーバーを起動するPython 3スクリプトを作成しようとしています。 Chromium Portableがすでにアクティブである場合、Firefoxポータブルが起動されない場合、サーバーへの新しいタブが開かれ、そこからサーバーにアクセスされます。 Chromium Portable Chrome.exeおよびFirefoxポータブルのすべてのプロセスが閉じられたら、サーバーをシャットダウンする必要があります。次のコードは、私がこれまでに書いたものです。
import subprocess
import os
drive = os.environ['HOMEDRIVE']
def launch_browser():
pass
def launch_pydoc():
pythonw = drive + '\PortableApps\PortablePython_3x\App\pythonw.exe'
doc_args = drive + '\PortableApps\PortablePython_3x\App\Lib\pydoc.py -p 50000'
spDoc = subprocess.Popen(pythonw+' '+doc_args)
def launch_chrome():
chrome = drive + '\PortableApps\ChromiumPortable\App\Chrome-bin\chrome.exe'
chrome_args = r'http://localhost:50000/ --user-data-dir="C:\Users\Owner\AppData\Roaming\ChromePortable\nathan" --new-tab'
spChrome = subprocess.Popen(chrome+' '+chrome_args)
def launch_mozilla():
mozilla = drive + '\PortableApps\FirefoxPortableNightly\FirefoxPortable.exe'
mozilla_args = 'http://localhost:50000/'
spMozilla = subprocess.Popen(mozilla+' '+mozilla_args)
このスクリプトは、HomeDriveの値を現在のフラッシュドライブレターに設定するバッチファイルから起動されるため、Pythonは常に実行可能ファイルを探す場所を把握します。私の問題は、Chromiumポータブルの新しいタブを単純に開くか、Firefoxポータブルを開くか、さらに閉じられたプロセスの各プロセスの後にサーバーをシャットダウンするかどうかを決定するプロセスを実装する方法がわからないことです。特にサブプロセスなどに関連する多くのリンクを見てきました 複数の子プロセスを待つ方法, サブプロセスを殺す方法 と Pythonプログラムの終了時にサブプロセスが死んでいることを保証します. 。 Pywin32、WMI、Comtypes、PsutilパッケージをPython 3のコピーにインストールしました。助けてください。コードを破棄する必要がある場合は問題ありません。私は学ぶことをしようとしています。前もって感謝します。
解決
原則として、Popenオブジェクトのwait()メソッドを使用できるはずです。このようなもの:
pydoc_process = launch_pydoc()
browser_process = launch_browser()
browser_process.wait()
pydoc_process.terminate()
(起動関数を変更して終了します return subprocess.Popen(...
)
しかし、それが最新のブラウザでどれだけうまく機能するかはわかりません。 Linuxでは、Firefoxが住所を開くために呼び出され、すでにFirefoxを開いていることを検出した場合、新しいプロセスはURLを古いプロセスに渡し、すぐに終了します。そのようなことは、あなたがやろうとしていることを台無しにするでしょう。