0

Chromium Portable、Firefox Portable、および Python 3 で構成されるフラッシュ ドライブにポータブル環境をセットアップしました。Chromium Portable または Firefox Portable でアクセスする pydoc サーバーを起動する Python 3 スクリプトを作成しようとしています。Chromium Portable が既にアクティブになっている場合は、サーバーへの新しいタブが開きます。そうでない場合は、Firefox Portable が起動され、そこからサーバーにアクセスします。Chromium Portable\chrome.exe と Firefox Portable のすべてのプロセスが終了したら、サーバーをシャットダウンする必要があります。次のコードは、これまでに書いたものです。

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 Portable で新しいタブを開くか、Firefox Portable を開き、さらにブラウザーの各プロセスが閉じられた後にサーバーをシャットダウンするかを決定するプロセスを実装する方法がわからないことです。サブプロセスなどに関する多くのリンク、特に複数の子プロセスを待機する方法、サブプロセスを強制終了する方法、 Python プログラムの終了時にサブプロセスが停止していることを確認する方法について調べました。. Python 3 のコピーに pywin32、wmi、comtypes、および psutil パッケージをインストールしました。助けてください。私のコードを破棄する必要がある場合は、問題ありません。私は学ぶことをしようとしています。前もって感謝します。

4

1 に答える 1

0

原則として、Popen オブジェクトの wait() メソッドを使用できるはずです。このようなもの:

pydoc_process = launch_pydoc()
browser_process = launch_browser()
browser_process.wait()
pydoc_process.terminate()

(起動関数を で終わるように変更しますreturn subprocess.Popen(...)

しかし、それが最新のブラウザーでどれだけうまく機能するかはわかりません。Linux では、アドレスを開くために Firefox が呼び出され、Firefox が既に開いていることが検出されると、新しいプロセスは URL を古いプロセスに渡し、すぐに終了します。そのようなことは、あなたがやろうとしていることを台無しにしてしまいます。

于 2010-12-11T21:30:02.950 に答える