2016-12-22 26 views
1

ローカルサーバーを起動して、同じPythonプログラムのブラウザでリンクを開きたいとします。同じpythonプログラムからローカルサーバーを起動してURLを開くにはどうすればよいですか?

これは、(非常にナイーブと愚かな試み)私が試したものです:

from subprocess import call 
import webbrowser 

call(["python", "-m", "SimpleHTTPServer"]) #This creates a server at port:8000 
webbrowser.open_new_tab("some/url") 

サーバがまだバックグラウンドで実行されているので、しかし、プログラムが第二の文には行きません。ブラウザを開くには、サーバーを終了して、サーバーを実行する目的を破る必要があります。

解決方法を提案してもらえますか?

答えて

1

デーモンスレッド(デーモンスレッドだけが残っているとPythonプログラムが終了します)でWebサーバーを起動し、メインスレッドからリクエストを行うことができます。

唯一の問題は、メインスレッドをサーバースレッドに同期させることです。これは、HTTPサーバーが起動するまでに時間がかかるため、この時点まで要求を処理しないためです。私はそれを行うための簡単できれいな解決策を認識していませんが、ちょうどあなたのメインスレッドを数秒間(おそらくは短く)一時停止し、その後に要求を開始することができます。もう1つの選択肢は、Webサーバーへのリクエストを最初から送信し、ある程度時間がかかって失敗することを期待することです。

ここでは、ローカルファイルシステムからのコンテンツを提供するシンプルなHTTPウェブサーバーを使用した小さなサンプルスクリプトlocalhost:8080とサンプルリクエストがあり、Webサーバー(この場合もスクリプト)のディレクトリからファイルfoo.txtを要求しています。

import sys 
import requests 
import threading 
import time 

from BaseHTTPServer import HTTPServer 
from SimpleHTTPServer import SimpleHTTPRequestHandler 

# set up the HTTP server and start it in a separate daemon thread 
httpd = HTTPServer(('localhost', 8080), SimpleHTTPRequestHandler) 
thread = threading.Thread(target=httpd.serve_forever) 
thread.daemon = True 

# if startup time is too long we might want to be able to quit the program 
try: 
    thread.start() 
except KeyboardInterrupt: 
    httpd.shutdown() 
    sys.exit(0) 

# wait until the webserver finished starting up (maybe wait longer or shorter...) 
time.sleep(5) 

# start sending requests 
r = requests.get('http://localhost:8080/foo.txt') 

print r.status_code 
# => 200 (hopefully...) 
+0

私はスレッドを見ていました。そして、これは完全に動作します。しかし、 'sys.exit(0)'を使用して終了しようとすると、 'error:[Errno 10054]という既存の接続がリモートホストによって強制的に閉じられました。これは、スレッドを「終了」するための正しい方法ですか、より良い方法がありますか? – Apara

関連する問題