2010-04-14 22 views
1
httpd = make_server('', 80, server) 
webbrowser.open(url) 
httpd.serve_forever() 

這個工程跨平臺,除非我在putty ssh終端上啓動它。 如何欺騙控制檯在單獨的進程中打開w3m瀏覽器,以便它可以繼續啓動服務器?python webbrowser.open(url)

或者如果在沒有x的shell上運行時無法跳過webbrowser.open?

回答

6

也許使用線程?要麼把服務器設置獨立於主線程或代替browsweropen爲:

import threading 
import webbrowser 

def start_browser(server_ready_event, url): 
    print "[Browser Thread] Waiting for server to start" 
    server_ready_event.wait() 
    print "[Browser Thread] Opening browser" 
    webbrowser.open(url) 

url = "someurl" 
server_ready = threading.Event() 
browser_thread = threading.Thread(target=start_browser, args=(server_ready, url)) 
browser_thread.start() 

print "[Main Thread] Starting server" 
httpd = make_server('', 80, server) 
print "[Main Thread] Server started" 
server_ready.set() 

httpd.serve_forever() 
browser_thread.join() 

(把服務器設置在主線程讓它趕上CTRL + C的事件,我認爲)

+0

在每個平臺上完美搭配有或沒有x :) – 2010-04-14 19:48:12

1

將登錄腳本中的BROWSER環境變量定義爲類似w3m的內容應該可以解決問題。

編輯:我意識到你不希望你的腳本在瀏覽器運行時被阻塞。

在這種情況下,可能像這樣簡單:
BROWSER="echo Please visit %s with a web browser"會更好。

1

按照Python docs

在Unix下,圖形瀏覽器X11下優選的,但如果圖形瀏覽器不可用或X11顯示不可用的文本模式的瀏覽器將被使用。如果使用文本模式瀏覽器,則調用進程將阻塞,直到用戶退出瀏覽器。

因此,您需要檢測您是否處於僅用於控制檯的環境中,並採取適當的措施(如不打開瀏覽器)。

或者,您可能可以定義BROWSER環境變量 - 如Alexandre所示 - 並讓其運行一個腳本,該腳本不執行任何操作或通過&在後臺打開瀏覽器。

+0

你怎麼檢測僅在python中使用控制檯? 腳本也可能在儘可能多的noob機器上運行,因爲它們只是啓動此腳本。 – 2010-04-14 18:42:55