2016-12-22 2 views
1

Я хочу запустить локальный сервер, а затем открыть ссылку с браузером из той же программы python.Как запустить локальный сервер и открыть URL-адреса из одной и той же программы python?

Это то, что я попытался (очень наивный и глупый попытка):

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 завершает работу, если остаются только потоки демона), а затем делать запросы из основного потока.

Единственная проблема заключается в синхронизации основного потока с потоком сервера, поскольку HTTP-серверу потребуется некоторое время для запуска и не будет обрабатывать какие-либо запросы до этого момента. Я не знаю простого и чистого решения, но вы можете (несколько взломать) просто приостановить свой основной поток на несколько секунд (возможно, короче) и начать делать запросы только после этого. Другим вариантом было бы просто отправлять запросы на веб-сервер с самого начала и ожидать, что они будут терпеть неудачу в течение некоторого времени.

Вот небольшой пример сценария с простой HTTP веб-сервер, который служит содержимое из локальной файловой системы через TCP на localhost:8080 и образец запроса, запрашивая файл 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)', я получаю много ошибок (в конце концов программа заканчивается), говоря «ошибка: [Errno 10054] Существующее соединение было принудительно закрыто удаленным хостом». Это правильный способ «закончить» поток или есть лучший способ там? – Apara

Смежные вопросы