2016-12-29 37 views
0

请查找以下代码,因为它会抛出错误 - global name 'webserver' is not defined全球名称'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): 
     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") 
+0

你从来没有分配任何价值'WebServer',所以'全球WebServer'是给你一个错误。只要删除线,它应该工作正常! –

回答

0

您的代码中不需要两行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模式线程,以便它可以与按Ctrl被打断 - Ç。我删除了几种方法,因为它们似乎并未在您的原始代码中提供用途,并向您展示了您的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) 
+1

'create_web_server'是'WebServer'类中的一个方法,因此从'main'调用它仍然会失败 – xbonez

+0

@xbonez好的捕获 - 在看了这段代码之后,它需要一些修改(并且可能会删除一些方法)。 – birryree