2016-12-29 2 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''에 값을 할당하지 :

당신은 뭔가를 할 수 있습니다. 그냥 선을 제거하고 잘 작동합니다! –

답변

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있는 디렉토리를 제공)를해야 코드의 단순화 된 버전입니다. C -이 Ctrl 키으로 중단 할 수 있도록

그것은 daemon 모드에서 스레드를 실행합니다. 그들은 원래 코드에서 목적을 달성하지 못했고 여러분의 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의 구현이 표준 방식 인 개발자에게 '자연 스럽다'고 느끼기 때문에 허용됩니다. 그래서`글로벌 WebServer` 당신에게 오류를주고,

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

관련 문제