Better asyncore.loop use. Also fixes a late bug in my first post of code: PILFile.seek(0) needed since PIL.save does not reset the pointer.
class ImageServer(RequestHandler): def __init__(self, conn, addr, server): asynchat.async_chat.__init__(self,conn) self.client_address = addr self.connection = conn self.server = server self.set_terminator ('\r\n\r\n') self.incoming = deque() self.outgoing = deque() self.rfile = None self.wfile = writewrapper(self.outgoing, -self.use_buffer or self.blocksize) self.found_terminator = self.handle_request_line self.request_version = "HTTP/1.1" self.code = None def send_head(self): buff, width, height = cam.dev.getbuffer() imPIL = (Image.frombuffer("RGB", (width, height), buff, "raw", "BGR", 0, -1) ) PILFile.seek(0) imPIL.save(PILFile, "JPEG") self.send_response(200) self.send_header("Content-type", "image/jpeg") self.send_header("Content-Length: ", str(PILFile.len)) self.end_headers() self.wfile.write(PILFile.getvalue()) return ... parser.add_option('-3', dest='server', help='Run the server for cam images', action='store_const', const=3) options, args = parser.parse_args() if options.server==3: from StringIO import StringIO from PIL import Image if sys.platform == 'win32': import VideoCapture try: del(cam) gc.collect() print "deleted old cam instance" except: pass cam = VideoCapture.Device(devnum=options.devNum, showVideoWindow=0) print cam buff, width, height = cam.dev.getbuffer() PILFile = StringIO() else: pass # try http://laurent.pointal.org/python/projets/pyvideograb/index.pih # or fg #import fg #cam = fg.Grabber() #cam.set_source(options.devNum) # or video4linux.video_capture / v4lctl else: if options.root is None: parser.error("Need root path to start server") if not os.path.isdir(options.root): parser.error("Root path does not exist") os.chdir(options.root) req_handler = which[options.server] s=Server('',options.port,req_handler) print req_handler.__name__, "running on port", options.port, "with root path", options.root while True: try: asyncore.loop(timeout=1, count=1) except KeyboardInter -- http://mail.python.org/mailman/listinfo/python-list