2013-10-24 6 views
6

मैं पाइथन परियोजना में सभी लिंक का परीक्षण करने के लिए http.server का उपयोग करने का प्रयास कर रहा हूं। अगर मैं अपनी स्क्रिप्ट चलाने से पहले सर्वर शुरू करता हूं, तो मैं अपनी स्क्रिप्ट को काम करने के लिए प्राप्त कर सकता हूं, और जब टर्मिनल विंडो बंद करता है तो सर्वर बंद हो जाता है। लेकिन मैं वास्तव में स्क्रिप्ट को सर्वर शुरू करने और रोकने के लिए पसंद करूंगा।मैं Python स्क्रिप्ट के भीतर से SimpleHTTPServer को कैसे मारूं?

मैंने बस सर्वर शुरू करने के लिए एक टेस्ट स्क्रिप्ट बनाई, एक पृष्ठ प्राप्त किया और सर्वर साबित कर रहा है, और फिर सर्वर को रोकें। मुझे सर्वर की पिड नहीं मिल रही है। जब मैं इस स्क्रिप्ट को स्क्रिप्ट चलाने के बाद रिपोर्ट करता हूं, तो मुझे एक संदेश मिलता है कि ऐसी कोई प्रक्रिया नहीं है; लेकिन सर्वर अभी भी चल रहा है।

मैं सर्वर के लिए सही पिड कैसे प्राप्त करूं, या अधिक आम तौर पर मैं स्क्रिप्ट से सर्वर को कैसे रोकूं?

import os 
import requests 
from time import sleep 

# Start server, in background. 
print("Starting server...") 
os.system('python -m http.server &') 
# Make sure server has a chance to start before making request. 
sleep(1) 

print "Server pid: " 
os.system('echo $$') 

url = 'http://localhost:8000/index.html' 
print("Testing request: ", url) 
r = requests.get(url) 
print("Status code: ", r.status_code) 
+2

उपयोग कर सकते हैं वापस आ जाएगी आप 'subprocess.Popen' बजाय' ओएस का इस्तेमाल कर सकते हैं .system', यह अतिरिक्त अतिरिक्त कार्यक्षमता प्रदान करता है जिसमें स्पॉन्डेड सबप्रोसेस की समाप्ति शामिल है। या आप बस 'SimpleHTTPServer' आयात कर सकते हैं और इसे सीधे अपनी स्क्रिप्ट में उपयोग कर सकते हैं ... – l4mpi

+0

यह सहायक है, लेकिन क्या आप थोड़ा और कह रहे हैं? कमांड लाइन से इसका उपयोग करने के बारे में SimpleHTTPServer बात का उपयोग करने के बारे में मुझे लगता है कि एकमात्र संदर्भ; मुझे पूरा यकीन नहीं है कि सर्वर को कैसे रोकें और एक पायथन लिपि के भीतर से सर्वर को कैसे शुरू करें। मैंने पहले कभी भी प्रक्रियाओं का उपयोग नहीं किया है, इसलिए मुझे यकीन नहीं है कि सर्वर सबप्रोसेस कैसे शुरू करें, और फिर इसे रोकें। सक्रिय रूप से googling ... – japhyr

+1

['subprocess' प्रलेखन] (http://docs.python.org/2/library/subprocess.html) में आपकी सभी आवश्यक जानकारी है, 'पॉपन' कन्स्ट्रक्टर के बारे में अनुभाग देखें और उपयोग करें 'पॉपन' ऑब्जेक्ट्स - आप कुछ ऐसा कर सकते हैं जैसे 'सर्वर = पॉपन (["पायथन", "-एम", "सरल एचटीटीपीएस सर्वर"])' और फिर 'server.terminate()' या 'server.kill()' का उपयोग करें प्रक्रिया खत्म करो। एक स्क्रिप्ट में 'SimpleHTTPServer' शुरू करने के लिए, बस' if __name__ == "__main __": 'SimpleHTTPServer में ब्लॉक को देखें।py - बस बेससेवर इंस्टेंस का संदर्भ रखें और इसे बंद करें (यह एक टीसीपीएस सर्वर सबक्लास है, इसलिए टीसीपीएस सर्वर डॉक्स को मदद करनी चाहिए)। – l4mpi

उत्तर

6

यहाँ मैं क्या कर रहा हूँ है:

import threading 

try: 
    from http.server import HTTPServer, SimpleHTTPRequestHandler # Python 3 
except ImportError: 
    from SimpleHTTPServer import BaseHTTPServer 
    HTTPServer = BaseHTTPServer.HTTPServer 
    from SimpleHTTPServer import SimpleHTTPRequestHandler # Python 2 

server = HTTPServer(('localhost', 0), SimpleHTTPRequestHandler) 
thread = threading.Thread(target = server.serve_forever) 
thread.daemon = True 
thread.start() 

def fin(): 
    server.shutdown() 

print('server running on port {}'.format(server.server_port)) 

# here is your program 

आप अपने कार्यक्रम में fin फोन है, तो सर्वर बंद हो जाता है।

+0

मैं फिलहाल पाइथन 2 का उपयोग कर रहा हूं, लेकिन मुझे इसे पायथन 3 पर भी चलाने के लिए अच्छा लगेगा। मुझे एक त्रुटि 'एचटीटीपीएस सर्वर नामक कोई मॉड्यूल' नहीं मिला, इसलिए मैंने पायथन 2 आयात को 'बेसएचटीटीपीएस सर्वर आयात HTTPServer' से बदल दिया। आयात काम करता था, लेकिन फिर मुझे एक त्रुटि मिली कि "__init __() को एक अप्रत्याशित कीवर्ड तर्क 'डेमन' मिला है। मुझे यह मिलता है अगर मैं इस स्क्रिप्ट के अपने संस्करण का उपयोग करता हूं, या अगर मैं सिर्फ अपनी स्क्रिप्ट कॉपी करता हूं और आयात को ठीक करता हूं। कोई सुझाव? – japhyr

+0

मैंने एक अतिरिक्त रेखा के साथ deamon तर्क तय किया। यह अब पाइथन 3 और 2 के तहत काम करना चाहिए - उम्मीद है कि। – User

+0

क्या आप Ctrl-C के साथ सर्वर को मारने में सक्षम हैं? –

1

मुझे यह चलाने के लिए मिला, लेकिन मुझे यह जानकर उत्सुकता है कि यह उपरोक्त उपयोगकर्ता के उत्तर की तुलना में कैसे तुलना करता है। स्वीकृत उत्तर here पर ध्यान देने के बाद मैं इसके साथ आया।

import subprocess 
import requests 
import os 
import signal 
from time import sleep 

print "Starting server..." 
cmd = 'python -m SimpleHTTPServer' 
pro = subprocess.Popen(cmd, shell=True, preexec_fn=os.setsid) 

# Make sure server has a chance to start before making request. 
sleep(1) 

url = 'http://localhost:8000/index.html' 
print "Testing request: ", url 
r = requests.get(url) 
print "Status code: ", r.status_code 

os.killpg(pro.pid, signal.SIGTERM) 
3

ऊपर उपयोगकर्ता की कोड के लिए एक मामूली संशोधन:

import threading 
try: 
    from http.server import HTTPServer, BaseHTTPRequestHandler # Python 3 
except ImportError: 
    import SimpleHTTPServer 
    from BaseHTTPServer import HTTPServer # Python 2 
    from SimpleHTTPServer import SimpleHTTPRequestHandler as BaseHTTPRequestHandler 
server = HTTPServer(('localhost', 0), BaseHTTPRequestHandler) 
thread = threading.Thread(target = server.serve_forever) 
thread.deamon = True 
def up(): 
    thread.start() 
    print('starting server on port {}'.format(server.server_port)) 
def down(): 
    server.shutdown() 
    print('stopping server on port {}'.format(server.server_port)) 
+0

मेरे लिए काम किया: डी –

0

ब्राउज़र उद्घाटन के साथ मेरे समाधान:

फ़ाइल: http.py

import SimpleHTTPServer 
import SocketServer 
import threading 
import webbrowser 
import platform 
from socket import SOL_SOCKET,SO_REUSEADDR 

class HTTPServer(): 

    def __init__(self,port=8000,url='http://localhost'): 
     self.port = port 
     self.thread = None 
     self.httpd = None     
     self.run = False 
     self.url = url 

     os = platform.system() 
     if os=='Linux': 
      self.browser_path = "/usr/bin/google-chrome %s"    
     elif os == 'Windows': 
      self.browser_path = "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe %s" 
     else: 
      print("Chrome not found!") 


    def start(self):   
     self.run = True  
     self.httpd = SocketServer.TCPServer(("", self.port), SimpleHTTPServer.SimpleHTTPRequestHandler) 
     self.httpd.socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 
     self.thread = threading.Thread(target = self._serve) 
     self.thread.start() 
     webbrowser.get(str(self.browser_path)).open(self.url+":"+str(self.port)+"/") 


    def _serve(self):   
     while self.run: 
      self.httpd.handle_request() 

    def stop(self): 
     self.run = False 
     self.httpd.server_close() 

के बाद, बस चलाने :

from http import HTTPServer 

server = HTTPServer() 
server.start() 

raw_input("Enter to close") 

server.stop() 
+0

क्रोम खोलने के बजाय आप विंडोज़ पर 'प्रारंभ% s' और ओएसएक्स पर'% s 'खोल सकते हैं (सुनिश्चित नहीं है लिनक्स) डिफ़ॉल्ट ब्राउज़र खोलने के लिए। –

0

यह समस्या का एक बंद समाधान है। अजगर पर काम करता है 3.

import os 
import threading 
import webbrowser 
from http.server import HTTPServer, SimpleHTTPRequestHandler 


def simple_http_server(host='localhost', port=4001, path='.'): 

    server = HTTPServer((host, port), SimpleHTTPRequestHandler) 
    thread = threading.Thread(target=server.serve_forever) 
    thread.deamon = True 

    cwd = os.getcwd() 

    def start(): 
     os.chdir(path) 
     thread.start() 
     webbrowser.open_new_tab('http://{}:{}'.format(host, port)) 
     print('starting server on port {}'.format(server.server_port)) 

    def stop(): 
     os.chdir(cwd) 
     server.shutdown() 
     server.socket.close() 
     print('stopping server on port {}'.format(server.server_port)) 

    return start, stop 

simple_http_server जो start और stop कार्यों

>>> start, stop = simple_http_server(port=4005, path='/path/to/folder') 

जो आप के रूप में

>>> start() 
starting server on port 4005 

127.0.0.1 - - [14/Aug/2016 17:49:31] "GET/HTTP/1.1" 200 - 

>>> stop() 
stopping server on port 4005 
संबंधित मुद्दे