socketserver renaming reversal part 3: move the module into the right

place and fix all references to it.  Closes #2926.
This commit is contained in:
Georg Brandl 2008-05-24 18:31:28 +00:00
parent 6acb075f03
commit e152a77d96
19 changed files with 409 additions and 411 deletions

View File

@ -21,7 +21,7 @@ Usually, this module isn't used directly, but is used as a basis for building
functioning Web servers. See the :mod:`SimpleHTTPServer` and functioning Web servers. See the :mod:`SimpleHTTPServer` and
:mod:`CGIHTTPServer` modules. :mod:`CGIHTTPServer` modules.
The first class, :class:`HTTPServer`, is a :class:`socketserver.TCPServer` The first class, :class:`HTTPServer`, is a :class:`SocketServer.TCPServer`
subclass. It creates and listens at the HTTP socket, dispatching the requests subclass. It creates and listens at the HTTP socket, dispatching the requests
to a handler. Code to create and run the server looks like this:: to a handler. Code to create and run the server looks like this::

View File

@ -1299,17 +1299,17 @@ the receiving end. A simple way of doing this is attaching a
logger2.warning('Jail zesty vixen who grabbed pay from quack.') logger2.warning('Jail zesty vixen who grabbed pay from quack.')
logger2.error('The five boxing wizards jump quickly.') logger2.error('The five boxing wizards jump quickly.')
At the receiving end, you can set up a receiver using the :mod:`socketserver` At the receiving end, you can set up a receiver using the :mod:`SocketServer`
module. Here is a basic working example:: module. Here is a basic working example::
import cPickle import cPickle
import logging import logging
import logging.handlers import logging.handlers
import socketserver import SocketServer
import struct import struct
class LogRecordStreamHandler(socketserver.StreamRequestHandler): class LogRecordStreamHandler(SocketServer.StreamRequestHandler):
"""Handler for a streaming logging request. """Handler for a streaming logging request.
This basically logs the record using whatever logging policy is This basically logs the record using whatever logging policy is
@ -1351,7 +1351,7 @@ module. Here is a basic working example::
# cycles and network bandwidth! # cycles and network bandwidth!
logger.handle(record) logger.handle(record)
class LogRecordSocketReceiver(socketserver.ThreadingTCPServer): class LogRecordSocketReceiver(SocketServer.ThreadingTCPServer):
"""simple TCP socket-based logging receiver suitable for testing. """simple TCP socket-based logging receiver suitable for testing.
""" """
@ -1360,7 +1360,7 @@ module. Here is a basic working example::
def __init__(self, host='localhost', def __init__(self, host='localhost',
port=logging.handlers.DEFAULT_TCP_LOGGING_PORT, port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,
handler=LogRecordStreamHandler): handler=LogRecordStreamHandler):
socketserver.ThreadingTCPServer.__init__(self, (host, port), handler) SocketServer.ThreadingTCPServer.__init__(self, (host, port), handler)
self.abort = 0 self.abort = 0
self.timeout = 1 self.timeout = 1
self.logname = None self.logname = None

View File

@ -7,8 +7,9 @@
.. sectionauthor:: Fred L. Drake, Jr. <fdrake@acm.org> .. sectionauthor:: Fred L. Drake, Jr. <fdrake@acm.org>
.. note:: .. note::
The :mod:`repr` module has been renamed to :mod:`reprlib` in The :mod:`repr` module has been renamed to :mod:`reprlib` in Python 3.0. The
Python 3.0. :term:`2to3` tool will automatically adapt imports when converting your
sources to 3.0.
The :mod:`repr` module provides a means for producing object representations The :mod:`repr` module provides a means for producing object representations
with limits on the size of the resulting strings. This is used in the Python with limits on the size of the resulting strings. This is used in the Python

View File

@ -22,7 +22,7 @@ XML-RPC servers written in Python. Servers can either be free standing, using
functions that can be called by the XML-RPC protocol. The *requestHandler* functions that can be called by the XML-RPC protocol. The *requestHandler*
parameter should be a factory for request handler instances; it defaults to parameter should be a factory for request handler instances; it defaults to
:class:`SimpleXMLRPCRequestHandler`. The *addr* and *requestHandler* parameters :class:`SimpleXMLRPCRequestHandler`. The *addr* and *requestHandler* parameters
are passed to the :class:`socketserver.TCPServer` constructor. If *logRequests* are passed to the :class:`SocketServer.TCPServer` constructor. If *logRequests*
is true (the default), requests will be logged; setting this parameter to false is true (the default), requests will be logged; setting this parameter to false
will turn off logging. The *allow_none* and *encoding* parameters are passed will turn off logging. The *allow_none* and *encoding* parameters are passed
on to :mod:`xmlrpclib` and control the XML-RPC responses that will be returned on to :mod:`xmlrpclib` and control the XML-RPC responses that will be returned
@ -63,7 +63,7 @@ SimpleXMLRPCServer Objects
-------------------------- --------------------------
The :class:`SimpleXMLRPCServer` class is based on The :class:`SimpleXMLRPCServer` class is based on
:class:`socketserver.TCPServer` and provides a means of creating simple, stand :class:`SocketServer.TCPServer` and provides a means of creating simple, stand
alone XML-RPC servers. alone XML-RPC servers.

View File

@ -481,7 +481,7 @@ The module :mod:`socket` exports the following constants and functions:
.. seealso:: .. seealso::
Module :mod:`socketserver` Module :mod:`SocketServer`
Classes that simplify writing network servers. Classes that simplify writing network servers.

View File

@ -1,19 +1,18 @@
:mod:`socketserver` --- A framework for network servers
:mod:`SocketServer` --- A framework for network servers
======================================================= =======================================================
.. module:: SocketServer .. module:: SocketServer
:synopsis: Old name for the socketserver module.
.. module:: socketserver
:synopsis: A framework for network servers. :synopsis: A framework for network servers.
.. note:: .. note::
The :mod:`SocketServer` module has been renamed to :mod:`socketserver` in
Python 3.0. It is importable under both names in Python 2.6 and the rest of The :mod:`SocketServer` module has been renamed to `socketserver` in Python
the 2.x series. 3.0. The :term:`2to3` tool will automatically adapt imports when converting
your sources to 3.0.
The :mod:`socketserver` module simplifies the task of writing network servers. The :mod:`SocketServer` module simplifies the task of writing network servers.
There are four basic server classes: :class:`TCPServer` uses the Internet TCP There are four basic server classes: :class:`TCPServer` uses the Internet TCP
protocol, which provides for continuous streams of data between the client and protocol, which provides for continuous streams of data between the client and
@ -220,7 +219,7 @@ server classes like :class:`TCPServer`; these methods aren't useful to external
users of the server object. users of the server object.
.. XXX should the default implementations of these be documented, or should .. XXX should the default implementations of these be documented, or should
it be assumed that the user will look at socketserver.py? it be assumed that the user will look at SocketServer.py?
.. function:: finish_request() .. function:: finish_request()
@ -325,14 +324,14 @@ request.
Examples Examples
-------- --------
:class:`socketserver.TCPServer` Example :class:`SocketServer.TCPServer` Example
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This is the server side:: This is the server side::
import socketserver import SocketServer
class MyTCPHandler(socketserver.BaseRequestHandler): class MyTCPHandler(SocketServer.BaseRequestHandler):
""" """
The RequestHandler class for our server. The RequestHandler class for our server.
@ -353,7 +352,7 @@ This is the server side::
HOST, PORT = "localhost", 9999 HOST, PORT = "localhost", 9999
# Create the server, binding to localhost on port 9999 # Create the server, binding to localhost on port 9999
server = socketserver.TCPServer((HOST, PORT), MyTCPHandler) server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
# Activate the server; this will keep running until you # Activate the server; this will keep running until you
# interrupt the program with Ctrl-C # interrupt the program with Ctrl-C
@ -362,7 +361,7 @@ This is the server side::
An alternative request handler class that makes use of streams (file-like An alternative request handler class that makes use of streams (file-like
objects that simplify communication by providing the standard file interface):: objects that simplify communication by providing the standard file interface)::
class MyTCPHandler(socketserver.StreamRequestHandler): class MyTCPHandler(SocketServer.StreamRequestHandler):
def handle(self): def handle(self):
# self.rfile is a file-like object created by the handler; # self.rfile is a file-like object created by the handler;
@ -423,14 +422,14 @@ Client::
Received: PYTHON IS NICE Received: PYTHON IS NICE
:class:`socketserver.UDPServer` Example :class:`SocketServer.UDPServer` Example
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This is the server side:: This is the server side::
import socketserver import SocketServer
class MyUDPHandler(socketserver.BaseRequestHandler): class MyUDPHandler(SocketServer.BaseRequestHandler):
""" """
This class works similar to the TCP handler class, except that This class works similar to the TCP handler class, except that
self.request consists of a pair of data and client socket, and since self.request consists of a pair of data and client socket, and since
@ -447,7 +446,7 @@ This is the server side::
if __name__ == "__main__": if __name__ == "__main__":
HOST, PORT = "localhost", 9999 HOST, PORT = "localhost", 9999
server = socketserver.UDPServer((HOST, PORT), BaseUDPRequestHandler) server = SocketServer.UDPServer((HOST, PORT), BaseUDPRequestHandler)
server.serve_forever() server.serve_forever()
This is the client side:: This is the client side::
@ -482,9 +481,9 @@ An example for the :class:`ThreadingMixIn` class::
import socket import socket
import threading import threading
import socketserver import SocketServer
class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler): class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
def handle(self): def handle(self):
data = self.request.recv(1024) data = self.request.recv(1024)
@ -492,7 +491,7 @@ An example for the :class:`ThreadingMixIn` class::
response = "%s: %s" % (cur_thread.getName(), data) response = "%s: %s" % (cur_thread.getName(), data)
self.request.send(response) self.request.send(response)
class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
pass pass
def client(ip, port, message): def client(ip, port, message):

File diff suppressed because it is too large Load Diff

View File

@ -74,7 +74,7 @@ import sys
import time import time
import socket # For gethostbyaddr() import socket # For gethostbyaddr()
import mimetools import mimetools
import socketserver import SocketServer
# Default error message template # Default error message template
DEFAULT_ERROR_MESSAGE = """\ DEFAULT_ERROR_MESSAGE = """\
@ -94,19 +94,19 @@ DEFAULT_ERROR_CONTENT_TYPE = "text/html"
def _quote_html(html): def _quote_html(html):
return html.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;") return html.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
class HTTPServer(socketserver.TCPServer): class HTTPServer(SocketServer.TCPServer):
allow_reuse_address = 1 # Seems to make sense in testing environment allow_reuse_address = 1 # Seems to make sense in testing environment
def server_bind(self): def server_bind(self):
"""Override server_bind to store the server name.""" """Override server_bind to store the server name."""
socketserver.TCPServer.server_bind(self) SocketServer.TCPServer.server_bind(self)
host, port = self.socket.getsockname()[:2] host, port = self.socket.getsockname()[:2]
self.server_name = socket.getfqdn(host) self.server_name = socket.getfqdn(host)
self.server_port = port self.server_port = port
class BaseHTTPRequestHandler(socketserver.StreamRequestHandler): class BaseHTTPRequestHandler(SocketServer.StreamRequestHandler):
"""HTTP request handler base class. """HTTP request handler base class.

View File

@ -101,7 +101,7 @@ server.handle_request()
import xmlrpclib import xmlrpclib
from xmlrpclib import Fault from xmlrpclib import Fault
import socketserver import SocketServer
import BaseHTTPServer import BaseHTTPServer
import sys import sys
import os import os
@ -512,7 +512,7 @@ class SimpleXMLRPCRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
if self.server.logRequests: if self.server.logRequests:
BaseHTTPServer.BaseHTTPRequestHandler.log_request(self, code, size) BaseHTTPServer.BaseHTTPRequestHandler.log_request(self, code, size)
class SimpleXMLRPCServer(socketserver.TCPServer, class SimpleXMLRPCServer(SocketServer.TCPServer,
SimpleXMLRPCDispatcher): SimpleXMLRPCDispatcher):
"""Simple XML-RPC server. """Simple XML-RPC server.
@ -536,7 +536,7 @@ class SimpleXMLRPCServer(socketserver.TCPServer,
self.logRequests = logRequests self.logRequests = logRequests
SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding) SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)
socketserver.TCPServer.__init__(self, addr, requestHandler, bind_and_activate) SocketServer.TCPServer.__init__(self, addr, requestHandler, bind_and_activate)
# [Bug #1222790] If possible, set close-on-exec flag; if a # [Bug #1222790] If possible, set close-on-exec flag; if a
# method spawns a subprocess, the subprocess shouldn't have # method spawns a subprocess, the subprocess shouldn't have

View File

@ -5,7 +5,7 @@ connect to the Idle process, which listens for the connection. Since Idle has
has only one client per server, this was not a limitation. has only one client per server, this was not a limitation.
+---------------------------------+ +-------------+ +---------------------------------+ +-------------+
| socketserver.BaseRequestHandler | | SocketIO | | SocketServer.BaseRequestHandler | | SocketIO |
+---------------------------------+ +-------------+ +---------------------------------+ +-------------+
^ | register() | ^ | register() |
| | unregister()| | | unregister()|
@ -31,7 +31,7 @@ import sys
import os import os
import socket import socket
import select import select
import socketserver import SocketServer
import struct import struct
import cPickle as pickle import cPickle as pickle
import threading import threading
@ -66,12 +66,12 @@ copy_reg.pickle(types.CodeType, pickle_code, unpickle_code)
BUFSIZE = 8*1024 BUFSIZE = 8*1024
LOCALHOST = '127.0.0.1' LOCALHOST = '127.0.0.1'
class RPCServer(socketserver.TCPServer): class RPCServer(SocketServer.TCPServer):
def __init__(self, addr, handlerclass=None): def __init__(self, addr, handlerclass=None):
if handlerclass is None: if handlerclass is None:
handlerclass = RPCHandler handlerclass = RPCHandler
socketserver.TCPServer.__init__(self, addr, handlerclass) SocketServer.TCPServer.__init__(self, addr, handlerclass)
def server_bind(self): def server_bind(self):
"Override TCPServer method, no bind() phase for connecting entity" "Override TCPServer method, no bind() phase for connecting entity"
@ -492,7 +492,7 @@ class RemoteProxy(object):
def __init__(self, oid): def __init__(self, oid):
self.oid = oid self.oid = oid
class RPCHandler(socketserver.BaseRequestHandler, SocketIO): class RPCHandler(SocketServer.BaseRequestHandler, SocketIO):
debugging = False debugging = False
location = "#S" # Server location = "#S" # Server
@ -500,10 +500,10 @@ class RPCHandler(socketserver.BaseRequestHandler, SocketIO):
def __init__(self, sock, addr, svr): def __init__(self, sock, addr, svr):
svr.current_handler = self ## cgt xxx svr.current_handler = self ## cgt xxx
SocketIO.__init__(self, sock) SocketIO.__init__(self, sock)
socketserver.BaseRequestHandler.__init__(self, sock, addr, svr) SocketServer.BaseRequestHandler.__init__(self, sock, addr, svr)
def handle(self): def handle(self):
"handle() method required by socketserver" "handle() method required by SocketServer"
self.mainloop() self.mainloop()
def get_remote_proxy(self, oid): def get_remote_proxy(self, oid):

View File

@ -35,7 +35,7 @@ try:
except ImportError: except ImportError:
thread = None thread = None
from socketserver import ThreadingTCPServer, StreamRequestHandler from SocketServer import ThreadingTCPServer, StreamRequestHandler
DEFAULT_LOGGING_CONFIG_PORT = 9030 DEFAULT_LOGGING_CONFIG_PORT = 9030

View File

@ -42,7 +42,7 @@ class AllTest(unittest.TestCase):
self.check_all("MimeWriter") self.check_all("MimeWriter")
self.check_all("queue") self.check_all("queue")
self.check_all("SimpleHTTPServer") self.check_all("SimpleHTTPServer")
self.check_all("socketserver") self.check_all("SocketServer")
self.check_all("StringIO") self.check_all("StringIO")
self.check_all("UserString") self.check_all("UserString")
self.check_all("aifc") self.check_all("aifc")

View File

@ -33,7 +33,7 @@ import os
import re import re
import select import select
import socket import socket
from socketserver import ThreadingTCPServer, StreamRequestHandler from SocketServer import ThreadingTCPServer, StreamRequestHandler
import string import string
import struct import struct
import sys import sys

View File

@ -216,7 +216,6 @@ class TestStdlibRemovals(unittest.TestCase):
class TestStdlibRenames(unittest.TestCase): class TestStdlibRenames(unittest.TestCase):
renames = {'Queue': 'queue', renames = {'Queue': 'queue',
'SocketServer': 'socketserver',
'ConfigParser': 'configparser', 'ConfigParser': 'configparser',
} }

View File

@ -1,5 +1,5 @@
""" """
Test suite for socketserver. Test suite for SocketServer.py.
""" """
import contextlib import contextlib
@ -13,7 +13,7 @@ import tempfile
import threading import threading
import time import time
import unittest import unittest
import socketserver import SocketServer
import test.test_support import test.test_support
from test.test_support import reap_children, verbose, TestSkipped from test.test_support import reap_children, verbose, TestSkipped
@ -40,12 +40,12 @@ def receive(sock, n, timeout=20):
raise RuntimeError, "timed out on %r" % (sock,) raise RuntimeError, "timed out on %r" % (sock,)
if HAVE_UNIX_SOCKETS: if HAVE_UNIX_SOCKETS:
class ForkingUnixStreamServer(socketserver.ForkingMixIn, class ForkingUnixStreamServer(SocketServer.ForkingMixIn,
socketserver.UnixStreamServer): SocketServer.UnixStreamServer):
pass pass
class ForkingUnixDatagramServer(socketserver.ForkingMixIn, class ForkingUnixDatagramServer(SocketServer.ForkingMixIn,
socketserver.UnixDatagramServer): SocketServer.UnixDatagramServer):
pass pass
@ -172,55 +172,55 @@ class SocketServerTest(unittest.TestCase):
s.close() s.close()
def test_TCPServer(self): def test_TCPServer(self):
self.run_server(socketserver.TCPServer, self.run_server(SocketServer.TCPServer,
socketserver.StreamRequestHandler, SocketServer.StreamRequestHandler,
self.stream_examine) self.stream_examine)
def test_ThreadingTCPServer(self): def test_ThreadingTCPServer(self):
self.run_server(socketserver.ThreadingTCPServer, self.run_server(SocketServer.ThreadingTCPServer,
socketserver.StreamRequestHandler, SocketServer.StreamRequestHandler,
self.stream_examine) self.stream_examine)
if HAVE_FORKING: if HAVE_FORKING:
def test_ForkingTCPServer(self): def test_ForkingTCPServer(self):
with simple_subprocess(self): with simple_subprocess(self):
self.run_server(socketserver.ForkingTCPServer, self.run_server(SocketServer.ForkingTCPServer,
socketserver.StreamRequestHandler, SocketServer.StreamRequestHandler,
self.stream_examine) self.stream_examine)
if HAVE_UNIX_SOCKETS: if HAVE_UNIX_SOCKETS:
def test_UnixStreamServer(self): def test_UnixStreamServer(self):
self.run_server(socketserver.UnixStreamServer, self.run_server(SocketServer.UnixStreamServer,
socketserver.StreamRequestHandler, SocketServer.StreamRequestHandler,
self.stream_examine) self.stream_examine)
def test_ThreadingUnixStreamServer(self): def test_ThreadingUnixStreamServer(self):
self.run_server(socketserver.ThreadingUnixStreamServer, self.run_server(SocketServer.ThreadingUnixStreamServer,
socketserver.StreamRequestHandler, SocketServer.StreamRequestHandler,
self.stream_examine) self.stream_examine)
if HAVE_FORKING: if HAVE_FORKING:
def test_ForkingUnixStreamServer(self): def test_ForkingUnixStreamServer(self):
with simple_subprocess(self): with simple_subprocess(self):
self.run_server(ForkingUnixStreamServer, self.run_server(ForkingUnixStreamServer,
socketserver.StreamRequestHandler, SocketServer.StreamRequestHandler,
self.stream_examine) self.stream_examine)
def test_UDPServer(self): def test_UDPServer(self):
self.run_server(socketserver.UDPServer, self.run_server(SocketServer.UDPServer,
socketserver.DatagramRequestHandler, SocketServer.DatagramRequestHandler,
self.dgram_examine) self.dgram_examine)
def test_ThreadingUDPServer(self): def test_ThreadingUDPServer(self):
self.run_server(socketserver.ThreadingUDPServer, self.run_server(SocketServer.ThreadingUDPServer,
socketserver.DatagramRequestHandler, SocketServer.DatagramRequestHandler,
self.dgram_examine) self.dgram_examine)
if HAVE_FORKING: if HAVE_FORKING:
def test_ForkingUDPServer(self): def test_ForkingUDPServer(self):
with simple_subprocess(self): with simple_subprocess(self):
self.run_server(socketserver.ForkingUDPServer, self.run_server(SocketServer.ForkingUDPServer,
socketserver.DatagramRequestHandler, SocketServer.DatagramRequestHandler,
self.dgram_examine) self.dgram_examine)
# Alas, on Linux (at least) recvfrom() doesn't return a meaningful # Alas, on Linux (at least) recvfrom() doesn't return a meaningful
@ -228,19 +228,19 @@ class SocketServerTest(unittest.TestCase):
# if HAVE_UNIX_SOCKETS: # if HAVE_UNIX_SOCKETS:
# def test_UnixDatagramServer(self): # def test_UnixDatagramServer(self):
# self.run_server(socketserver.UnixDatagramServer, # self.run_server(SocketServer.UnixDatagramServer,
# socketserver.DatagramRequestHandler, # SocketServer.DatagramRequestHandler,
# self.dgram_examine) # self.dgram_examine)
# #
# def test_ThreadingUnixDatagramServer(self): # def test_ThreadingUnixDatagramServer(self):
# self.run_server(socketserver.ThreadingUnixDatagramServer, # self.run_server(SocketServer.ThreadingUnixDatagramServer,
# socketserver.DatagramRequestHandler, # SocketServer.DatagramRequestHandler,
# self.dgram_examine) # self.dgram_examine)
# #
# if HAVE_FORKING: # if HAVE_FORKING:
# def test_ForkingUnixDatagramServer(self): # def test_ForkingUnixDatagramServer(self):
# self.run_server(socketserver.ForkingUnixDatagramServer, # self.run_server(SocketServer.ForkingUnixDatagramServer,
# socketserver.DatagramRequestHandler, # SocketServer.DatagramRequestHandler,
# self.dgram_examine) # self.dgram_examine)

View File

@ -8,7 +8,7 @@ from wsgiref.validate import validator
from wsgiref.simple_server import WSGIServer, WSGIRequestHandler, demo_app from wsgiref.simple_server import WSGIServer, WSGIRequestHandler, demo_app
from wsgiref.simple_server import make_server from wsgiref.simple_server import make_server
from StringIO import StringIO from StringIO import StringIO
from socketserver import BaseServer from SocketServer import BaseServer
import re, sys import re, sys
from test import test_support from test import test_support

View File

@ -161,9 +161,6 @@ Library
- The multifile module has been deprecated as per PEP 4. - The multifile module has been deprecated as per PEP 4.
- The SocketServer module has been renamed 'socketserver'. The old
name is now deprecated.
- The imageop module has been deprecated for removal in Python 3.0. - The imageop module has been deprecated for removal in Python 3.0.
- Issue #2250: Exceptions raised during evaluation of names in - Issue #2250: Exceptions raised during evaluation of names in

View File

@ -1973,7 +1973,7 @@ site Append module search paths for third-party packages to
sys.path. sys.path.
smtplib SMTP Client class (RFC 821) smtplib SMTP Client class (RFC 821)
sndhdr Several routines that help recognizing sound. sndhdr Several routines that help recognizing sound.
socketserver Generic socket server classes. SocketServer Generic socket server classes.
stat Constants and functions for interpreting stat/lstat struct. stat Constants and functions for interpreting stat/lstat struct.
statcache Maintain a cache of file stats. statcache Maintain a cache of file stats.
statvfs Constants for interpreting statvfs struct as returned by statvfs Constants for interpreting statvfs struct as returned by