2010-11-27 75 views
0

我在我的閃存驅動器上設置了一個可移植環境,包括Chromium Portable,Firefox Portable和Python 3.我正在嘗試編寫一個Python 3腳本,它將啓動一個pydoc服務器,以便在Chromium Portable或Firefox Portable 。如果Chromium Portable已處於活動狀態,則將打開服務器的新選項卡,如果不啓動Firefox Portable,則將從該處啓動服務器。當Chromeium Portable \ chrome.exe和Firefox Portable的所有進程都已關閉時,應關閉服務器。以下代碼是我迄今爲止編寫的代碼。如何設置在便攜式瀏覽器關閉時關閉的便攜式pydoc服務器?

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,並且在關閉任何瀏覽器的每個過程後關閉服務器。我查看了許多與子過程有關的鏈接,尤其是how to wait for multiple child processeshow to kill a subprocessensuring subprocesses are dead on exiting python program。我在我的Python 3副本中安裝了pywin32,wmi,comtypes和psutil包。請幫忙?如果有必要丟棄我的代碼,那就OK了。我在嘗試學習。提前致謝。

回答

0

原則上,您應該可以使用Popen對象的wait()方法。事情是這樣的:

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

(修改你發佈的功能與return subprocess.Popen(...結束)

但我不知道如何,將與現代的瀏覽器。在Linux中,如果調用Firefox來打開地址,並且它檢測到您已打開Firefox,則新進程會將URL傳遞到舊進程並立即退出。這種事情會搞砸你想要做的事情。

+0

非常感謝!這解決了我的大部分問題。我會看看我能不能找出其餘的。 – iancormac84 2010-12-13 02:10:20