глобальное имя ‘WebServer’ не определено

Пожалуйста, найдите ниже код, как он бросает ошибку — global name 'webserver' is not defined.

import SimpleHTTPServer
import SocketServer
import os
from threading import Thread
import threading

class WebServer(Thread):
    def __init__(self, stream_path):
        """
        Class to create a Web server and add given folder to the web server which is passed as an argument.
        In this case it creates the web server to the incoming streams pushed by VLC to temp folder
        """
        Thread.__init__(self)
        self.stream_path = stream_path

    def run(self):
        global WebServer
        """
        This method is built in Thread object method invoked by start()
        and the code which is under run() will be executed.
        """
        os.chdir(self.stream_path)
        PORT = 8000
        Handler = SimpleHTTPServer.SimpleHTTPRequestHandler

        httpd = SocketServer.TCPServer(("", PORT), Handler)

        print "serving at port", PORT
        print "function thread", threading.currentThread()
        httpd.serve_forever()
        print "test1"

    def create_web_server(self,stream_path):
        global WebServer
        """
        This method is to create the web server to a given path
        """
        obj1 = WebServer(self,stream_path)
        obj1.start()
        print "server created"

    def stop_web_server(self):
        cmd='tskill python /A'
        os.system(cmd)

if __name__ == '__main__':
     create_web_server("","C:\QED")

1 ответ

  1. Вам не нужны две global WebServerстроки в коде. globalКлючевое слово используется для предоставления доступа на запись к глобальной переменной, и у вас нет глобальной переменной с именем WebServer.

    Ваш код должен выглядеть следующим образом, чтобы устранить ошибку, хотя в своем состоянии он все равно будет выдавать ошибки, потому что ваш код имеет несколько проблем, включая вызов create_web_serverметода сам по себе, так как это метод, который должен быть запущен на WebServerобъекте.

    Я включил рабочий пример прототипа вашего кода в нижней части моего сообщения.

    import SimpleHTTPServer
    import SocketServer
    import os
    from threading import Thread
    import threading
    
    class WebServer(Thread):
        def __init__(self, stream_path):
            """
            Class to create a Web server and add given folder to the web server which is passed as an argument.
            In this case it creates the web server to the incoming streams pushed by VLC to temp folder
            """
            Thread.__init__(self)
            self.stream_path = stream_path
    
        def run(self):
            """
            This method is built in Thread object method invoked by start()
            and the code which is under run() will be executed.
            """
            os.chdir(self.stream_path)
            PORT = 8000
            Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
    
            httpd = SocketServer.TCPServer(("", PORT), Handler)
    
            print "serving at port", PORT
            print "function thread", threading.currentThread()
            httpd.serve_forever()
            print "test1"
    
        def create_web_server(self,stream_path):
            """
            This method is to create the web server to a given path
            """
            obj1 = WebServer(self,stream_path)
            obj1.start()
            print "server created"
    
        def stop_web_server(self):
            cmd='tskill python /A'
            os.system(cmd)
    
    if __name__ == '__main__':
         create_web_server("","C:\\QED")
    

    Вот упрощенная версия вашего кода, которая должна делать то же самое (служить каталогом с базовым SimpleHTTPRequestHandler).

    Он запускает поток в daemonрежиме, так что он может быть прерван с CtrlC. Я удалил несколько методов, поскольку они, казалось, не служили цели в вашем исходном коде, и чтобы показать вам базовую структуру того, как ваш WebServerкласс, вероятно, будет выглядеть.

    import threading
    import os
    import time
    import SimpleHTTPServer
    import SocketServer
    
    class WebServer(threading.Thread):
        # Let's specify additional constructor arguments for host/port
        # so you don't have to hardcode those values.
        # We can specify default values for them as well.
        def __init__(self, stream_path, host='localhost', port=8000):
            super(WebServer, self).__init__()
            self.stream_path = stream_path
            self.host = host
            self.port = port
    
        # This is the method that will be called when you call
        # .start() on a WebServer object.
        def run(self):
            os.chdir(self.stream_path)
            handler = SimpleHTTPServer.SimpleHTTPRequestHandler
            httpd = SocketServer.TCPServer((self.host, self.port), handler)
            httpd.serve_forever()
    
    
    if __name__ == '__main__':
        # Create a WebServer thread object, set it to daemonize
        # and start it
        ws = WebServer(r'C:\QED')
        ws.daemon = True 
        ws.start()
    
        # Since the main thread doesn't do anything after daemonizing
        # the WebServer, it would exit immediately.
        # This forever loop just ensures that the main thread runs
        while True: time.sleep(1)
    

    И чтобы сделать следующий шаг, вам не нужно создавать Threadподкласс. Это разрешено, потому что это кажется более «естественным» разработчикам, которые знакомы с Java, где подклассы Threadили реализация Runnableявляется стандартной практикой.

    Вы можете просто сделать что-то вроде:

    import threading
    import os
    import time
    import SimpleHTTPServer
    import SocketServer
    
    def run_http_server(serve_dir, host='localhost', port=8000):
        os.chdir(serve_dir)
        handler = SimpleHTTPServer.SimpleHTTPRequestHandler
        httpd = SocketServer.TCPServer((host, port), handler)
        httpd.serve_forever()
    
    if __name__ == '__main__':
        thread = threading.Thread(target=run_http_server, args=(r'C:\QED',))
        thread.daemon = True
        thread.start()
    
        while True: time.sleep(1)