| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | :tocdepth: 2
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =========================
 | 
					
						
							|  |  |  | Library and Extension FAQ
 | 
					
						
							|  |  |  | =========================
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-28 13:28:44 +01:00
										 |  |  | .. only:: html
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. contents::
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | General Library Questions
 | 
					
						
							|  |  |  | =========================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | How do I find a module or application to perform task X?
 | 
					
						
							|  |  |  | --------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Check :ref:`the Library Reference <library-index>` to see if there's a relevant
 | 
					
						
							|  |  |  | standard library module.  (Eventually you'll learn what's in the standard
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  | library and will be able to skip this step.)
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 75365,75394,75402-75403,75418,75459,75484,75592-75596,75600,75602-75607,75610-75613,75616-75617,75623,75627,75640,75647,75696,75795 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r75365 | georg.brandl | 2009-10-11 22:16:16 +0200 (So, 11 Okt 2009) | 1 line
  Fix broken links found by "make linkcheck".  scipy.org seems to be done right now, so I could not verify links going there.
........
  r75394 | georg.brandl | 2009-10-13 20:10:59 +0200 (Di, 13 Okt 2009) | 1 line
  Fix markup.
........
  r75402 | georg.brandl | 2009-10-14 17:51:48 +0200 (Mi, 14 Okt 2009) | 1 line
  #7125: fix typo.
........
  r75403 | georg.brandl | 2009-10-14 17:57:46 +0200 (Mi, 14 Okt 2009) | 1 line
  #7126: os.environ changes *do* take effect in subprocesses started with os.system().
........
  r75418 | georg.brandl | 2009-10-14 20:48:32 +0200 (Mi, 14 Okt 2009) | 1 line
  #7116: str.join() takes an iterable.
........
  r75459 | georg.brandl | 2009-10-17 10:57:43 +0200 (Sa, 17 Okt 2009) | 1 line
  Fix refleaks in _ctypes PyCSimpleType_New, which fixes the refleak seen in test___all__.
........
  r75484 | georg.brandl | 2009-10-18 09:58:12 +0200 (So, 18 Okt 2009) | 1 line
  Fix missing word.
........
  r75592 | georg.brandl | 2009-10-22 09:05:48 +0200 (Do, 22 Okt 2009) | 1 line
  Fix punctuation.
........
  r75593 | georg.brandl | 2009-10-22 09:06:49 +0200 (Do, 22 Okt 2009) | 1 line
  Revert unintended change.
........
  r75594 | georg.brandl | 2009-10-22 09:56:02 +0200 (Do, 22 Okt 2009) | 1 line
  Fix markup.
........
  r75595 | georg.brandl | 2009-10-22 09:56:56 +0200 (Do, 22 Okt 2009) | 1 line
  Fix duplicate target.
........
  r75596 | georg.brandl | 2009-10-22 10:05:04 +0200 (Do, 22 Okt 2009) | 1 line
  Add a new directive marking up implementation details and start using it.
........
  r75600 | georg.brandl | 2009-10-22 13:01:46 +0200 (Do, 22 Okt 2009) | 1 line
  Make it more robust.
........
  r75602 | georg.brandl | 2009-10-22 13:28:06 +0200 (Do, 22 Okt 2009) | 1 line
  Document new directive.
........
  r75603 | georg.brandl | 2009-10-22 13:28:23 +0200 (Do, 22 Okt 2009) | 1 line
  Allow short form with text as argument.
........
  r75604 | georg.brandl | 2009-10-22 13:36:50 +0200 (Do, 22 Okt 2009) | 1 line
  Fix stylesheet for multi-paragraph impl-details.
........
  r75605 | georg.brandl | 2009-10-22 13:48:10 +0200 (Do, 22 Okt 2009) | 1 line
  Use "impl-detail" directive where applicable.
........
  r75606 | georg.brandl | 2009-10-22 17:00:06 +0200 (Do, 22 Okt 2009) | 1 line
  #6324: membership test tries iteration via __iter__.
........
  r75607 | georg.brandl | 2009-10-22 17:04:09 +0200 (Do, 22 Okt 2009) | 1 line
  #7088: document new functions in signal as Unix-only.
........
  r75610 | georg.brandl | 2009-10-22 17:27:24 +0200 (Do, 22 Okt 2009) | 1 line
  Reorder __slots__ fine print and add a clarification.
........
  r75611 | georg.brandl | 2009-10-22 17:42:32 +0200 (Do, 22 Okt 2009) | 1 line
  #7035: improve docs of the various <method>_errors() functions, and give them docstrings.
........
  r75612 | georg.brandl | 2009-10-22 17:52:15 +0200 (Do, 22 Okt 2009) | 1 line
  #7156: document curses as Unix-only.
........
  r75613 | georg.brandl | 2009-10-22 17:54:35 +0200 (Do, 22 Okt 2009) | 1 line
  #6977: getopt does not support optional option arguments.
........
  r75616 | georg.brandl | 2009-10-22 18:17:05 +0200 (Do, 22 Okt 2009) | 1 line
  Add proper references.
........
  r75617 | georg.brandl | 2009-10-22 18:20:55 +0200 (Do, 22 Okt 2009) | 1 line
  Make printout margin important.
........
  r75623 | georg.brandl | 2009-10-23 10:14:44 +0200 (Fr, 23 Okt 2009) | 1 line
  #7188: fix optionxform() docs.
........
  r75627 | fred.drake | 2009-10-23 15:04:51 +0200 (Fr, 23 Okt 2009) | 2 lines
  add further note about what's passed to optionxform
........
  r75640 | neil.schemenauer | 2009-10-23 21:58:17 +0200 (Fr, 23 Okt 2009) | 2 lines
  Improve some docstrings in the 'warnings' module.
........
  r75647 | georg.brandl | 2009-10-24 12:04:19 +0200 (Sa, 24 Okt 2009) | 1 line
  Fix markup.
........
  r75696 | georg.brandl | 2009-10-25 21:25:43 +0100 (So, 25 Okt 2009) | 1 line
  Fix a demo.
........
  r75795 | georg.brandl | 2009-10-27 16:10:22 +0100 (Di, 27 Okt 2009) | 1 line
  Fix a strange mis-edit.
........
											
										 
											2009-10-27 15:28:25 +00:00
										 |  |  | For third-party packages, search the `Python Package Index
 | 
					
						
							| 
									
										
										
										
											2014-10-29 08:36:35 +01:00
										 |  |  | <https://pypi.python.org/pypi>`_ or try `Google <https://www.google.com>`_ or
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 75365,75394,75402-75403,75418,75459,75484,75592-75596,75600,75602-75607,75610-75613,75616-75617,75623,75627,75640,75647,75696,75795 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r75365 | georg.brandl | 2009-10-11 22:16:16 +0200 (So, 11 Okt 2009) | 1 line
  Fix broken links found by "make linkcheck".  scipy.org seems to be done right now, so I could not verify links going there.
........
  r75394 | georg.brandl | 2009-10-13 20:10:59 +0200 (Di, 13 Okt 2009) | 1 line
  Fix markup.
........
  r75402 | georg.brandl | 2009-10-14 17:51:48 +0200 (Mi, 14 Okt 2009) | 1 line
  #7125: fix typo.
........
  r75403 | georg.brandl | 2009-10-14 17:57:46 +0200 (Mi, 14 Okt 2009) | 1 line
  #7126: os.environ changes *do* take effect in subprocesses started with os.system().
........
  r75418 | georg.brandl | 2009-10-14 20:48:32 +0200 (Mi, 14 Okt 2009) | 1 line
  #7116: str.join() takes an iterable.
........
  r75459 | georg.brandl | 2009-10-17 10:57:43 +0200 (Sa, 17 Okt 2009) | 1 line
  Fix refleaks in _ctypes PyCSimpleType_New, which fixes the refleak seen in test___all__.
........
  r75484 | georg.brandl | 2009-10-18 09:58:12 +0200 (So, 18 Okt 2009) | 1 line
  Fix missing word.
........
  r75592 | georg.brandl | 2009-10-22 09:05:48 +0200 (Do, 22 Okt 2009) | 1 line
  Fix punctuation.
........
  r75593 | georg.brandl | 2009-10-22 09:06:49 +0200 (Do, 22 Okt 2009) | 1 line
  Revert unintended change.
........
  r75594 | georg.brandl | 2009-10-22 09:56:02 +0200 (Do, 22 Okt 2009) | 1 line
  Fix markup.
........
  r75595 | georg.brandl | 2009-10-22 09:56:56 +0200 (Do, 22 Okt 2009) | 1 line
  Fix duplicate target.
........
  r75596 | georg.brandl | 2009-10-22 10:05:04 +0200 (Do, 22 Okt 2009) | 1 line
  Add a new directive marking up implementation details and start using it.
........
  r75600 | georg.brandl | 2009-10-22 13:01:46 +0200 (Do, 22 Okt 2009) | 1 line
  Make it more robust.
........
  r75602 | georg.brandl | 2009-10-22 13:28:06 +0200 (Do, 22 Okt 2009) | 1 line
  Document new directive.
........
  r75603 | georg.brandl | 2009-10-22 13:28:23 +0200 (Do, 22 Okt 2009) | 1 line
  Allow short form with text as argument.
........
  r75604 | georg.brandl | 2009-10-22 13:36:50 +0200 (Do, 22 Okt 2009) | 1 line
  Fix stylesheet for multi-paragraph impl-details.
........
  r75605 | georg.brandl | 2009-10-22 13:48:10 +0200 (Do, 22 Okt 2009) | 1 line
  Use "impl-detail" directive where applicable.
........
  r75606 | georg.brandl | 2009-10-22 17:00:06 +0200 (Do, 22 Okt 2009) | 1 line
  #6324: membership test tries iteration via __iter__.
........
  r75607 | georg.brandl | 2009-10-22 17:04:09 +0200 (Do, 22 Okt 2009) | 1 line
  #7088: document new functions in signal as Unix-only.
........
  r75610 | georg.brandl | 2009-10-22 17:27:24 +0200 (Do, 22 Okt 2009) | 1 line
  Reorder __slots__ fine print and add a clarification.
........
  r75611 | georg.brandl | 2009-10-22 17:42:32 +0200 (Do, 22 Okt 2009) | 1 line
  #7035: improve docs of the various <method>_errors() functions, and give them docstrings.
........
  r75612 | georg.brandl | 2009-10-22 17:52:15 +0200 (Do, 22 Okt 2009) | 1 line
  #7156: document curses as Unix-only.
........
  r75613 | georg.brandl | 2009-10-22 17:54:35 +0200 (Do, 22 Okt 2009) | 1 line
  #6977: getopt does not support optional option arguments.
........
  r75616 | georg.brandl | 2009-10-22 18:17:05 +0200 (Do, 22 Okt 2009) | 1 line
  Add proper references.
........
  r75617 | georg.brandl | 2009-10-22 18:20:55 +0200 (Do, 22 Okt 2009) | 1 line
  Make printout margin important.
........
  r75623 | georg.brandl | 2009-10-23 10:14:44 +0200 (Fr, 23 Okt 2009) | 1 line
  #7188: fix optionxform() docs.
........
  r75627 | fred.drake | 2009-10-23 15:04:51 +0200 (Fr, 23 Okt 2009) | 2 lines
  add further note about what's passed to optionxform
........
  r75640 | neil.schemenauer | 2009-10-23 21:58:17 +0200 (Fr, 23 Okt 2009) | 2 lines
  Improve some docstrings in the 'warnings' module.
........
  r75647 | georg.brandl | 2009-10-24 12:04:19 +0200 (Sa, 24 Okt 2009) | 1 line
  Fix markup.
........
  r75696 | georg.brandl | 2009-10-25 21:25:43 +0100 (So, 25 Okt 2009) | 1 line
  Fix a demo.
........
  r75795 | georg.brandl | 2009-10-27 16:10:22 +0100 (Di, 27 Okt 2009) | 1 line
  Fix a strange mis-edit.
........
											
										 
											2009-10-27 15:28:25 +00:00
										 |  |  | another Web search engine.  Searching for "Python" plus a keyword or two for
 | 
					
						
							|  |  |  | your topic of interest will usually find something helpful.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Where is the math.py (socket.py, regex.py, etc.) source file?
 | 
					
						
							|  |  |  | -------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-06 18:46:57 +00:00
										 |  |  | If you can't find a source file for a module it may be a built-in or
 | 
					
						
							|  |  |  | dynamically loaded module implemented in C, C++ or other compiled language.
 | 
					
						
							|  |  |  | In this case you may not have the source file or it may be something like
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  | :file:`mathmodule.c`, somewhere in a C source directory (not on the Python Path).
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | There are (at least) three kinds of modules in Python:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 1) modules written in Python (.py);
 | 
					
						
							|  |  |  | 2) modules written in C and dynamically loaded (.dll, .pyd, .so, .sl, etc);
 | 
					
						
							|  |  |  | 3) modules written in C and linked with the interpreter; to get a list of these,
 | 
					
						
							|  |  |  |    type::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       import sys
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  |       print(sys.builtin_module_names)
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | How do I make a Python script executable on Unix?
 | 
					
						
							|  |  |  | -------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | You need to do two things: the script file's mode must be executable and the
 | 
					
						
							|  |  |  | first line must begin with ``#!`` followed by the path of the Python
 | 
					
						
							|  |  |  | interpreter.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The first is done by executing ``chmod +x scriptfile`` or perhaps ``chmod 755
 | 
					
						
							|  |  |  | scriptfile``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The second can be done in a number of ways.  The most straightforward way is to
 | 
					
						
							|  |  |  | write ::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   #!/usr/local/bin/python
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | as the very first line of your file, using the pathname for where the Python
 | 
					
						
							|  |  |  | interpreter is installed on your platform.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | If you would like the script to be independent of where the Python interpreter
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  | lives, you can use the :program:`env` program.  Almost all Unix variants support
 | 
					
						
							|  |  |  | the following, assuming the Python interpreter is in a directory on the user's
 | 
					
						
							|  |  |  | :envvar:`PATH`::
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   #!/usr/bin/env python
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  | *Don't* do this for CGI scripts.  The :envvar:`PATH` variable for CGI scripts is
 | 
					
						
							|  |  |  | often very minimal, so you need to use the actual absolute pathname of the
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | interpreter.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  | Occasionally, a user's environment is so full that the :program:`/usr/bin/env`
 | 
					
						
							|  |  |  | program fails; or there's no env program at all.  In that case, you can try the
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | following hack (due to Alex Rezinsky)::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    #! /bin/sh
 | 
					
						
							|  |  |  |    """:"
 | 
					
						
							|  |  |  |    exec python $0 ${1+"$@"}
 | 
					
						
							|  |  |  |    """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The minor disadvantage is that this defines the script's __doc__ string.
 | 
					
						
							|  |  |  | However, you can fix that by adding ::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    __doc__ = """...Whatever..."""
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Is there a curses/termcap package for Python?
 | 
					
						
							|  |  |  | ---------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. XXX curses *is* built by default, isn't it?
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | For Unix variants: The standard Python source distribution comes with a curses
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  | module in the :source:`Modules` subdirectory, though it's not compiled by default.
 | 
					
						
							|  |  |  | (Note that this is not available in the Windows distribution -- there is no
 | 
					
						
							|  |  |  | curses module for Windows.)
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  | The :mod:`curses` module supports basic curses features as well as many additional
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | functions from ncurses and SYSV curses such as colour, alternative character set
 | 
					
						
							|  |  |  | support, pads, and mouse support. This means the module isn't compatible with
 | 
					
						
							|  |  |  | operating systems that only have BSD curses, but there don't seem to be any
 | 
					
						
							|  |  |  | currently maintained OSes that fall into this category.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | For Windows: use `the consolelib module
 | 
					
						
							|  |  |  | <http://effbot.org/zone/console-index.htm>`_.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Is there an equivalent to C's onexit() in Python?
 | 
					
						
							|  |  |  | -------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The :mod:`atexit` module provides a register function that is similar to C's
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  | :c:func:`onexit`.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Why don't my signal handlers work?
 | 
					
						
							|  |  |  | ----------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The most common problem is that the signal handler is declared with the wrong
 | 
					
						
							|  |  |  | argument list.  It is called as ::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    handler(signum, frame)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | so it should be declared with two arguments::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    def handler(signum, frame):
 | 
					
						
							|  |  |  |        ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Common tasks
 | 
					
						
							|  |  |  | ============
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | How do I test a Python program or component?
 | 
					
						
							|  |  |  | --------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Python comes with two testing frameworks.  The :mod:`doctest` module finds
 | 
					
						
							|  |  |  | examples in the docstrings for a module and runs them, comparing the output with
 | 
					
						
							|  |  |  | the expected output given in the docstring.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The :mod:`unittest` module is a fancier testing framework modelled on Java and
 | 
					
						
							|  |  |  | Smalltalk testing frameworks.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  | To make testing easier, you should use good modular design in your program.
 | 
					
						
							|  |  |  | Your program should have almost all functionality
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | encapsulated in either functions or class methods -- and this sometimes has the
 | 
					
						
							|  |  |  | surprising and delightful effect of making the program run faster (because local
 | 
					
						
							|  |  |  | variable accesses are faster than global accesses).  Furthermore the program
 | 
					
						
							|  |  |  | should avoid depending on mutating global variables, since this makes testing
 | 
					
						
							|  |  |  | much more difficult to do.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The "global main logic" of your program may be as simple as ::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    if __name__ == "__main__":
 | 
					
						
							|  |  |  |        main_logic()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | at the bottom of the main module of your program.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Once your program is organized as a tractable collection of functions and class
 | 
					
						
							|  |  |  | behaviours you should write test functions that exercise the behaviours.  A test
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  | suite that automates a sequence of tests can be associated with each module.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | This sounds like a lot of work, but since Python is so terse and flexible it's
 | 
					
						
							|  |  |  | surprisingly easy.  You can make coding much more pleasant and fun by writing
 | 
					
						
							|  |  |  | your test functions in parallel with the "production code", since this makes it
 | 
					
						
							|  |  |  | easy to find bugs and even design flaws earlier.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "Support modules" that are not intended to be the main module of a program may
 | 
					
						
							|  |  |  | include a self-test of the module. ::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    if __name__ == "__main__":
 | 
					
						
							|  |  |  |        self_test()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Even programs that interact with complex external interfaces may be tested when
 | 
					
						
							|  |  |  | the external interfaces are unavailable by using "fake" interfaces implemented
 | 
					
						
							|  |  |  | in Python.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | How do I create documentation from doc strings?
 | 
					
						
							|  |  |  | -----------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The :mod:`pydoc` module can create HTML from the doc strings in your Python
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 75365,75394,75402-75403,75418,75459,75484,75592-75596,75600,75602-75607,75610-75613,75616-75617,75623,75627,75640,75647,75696,75795 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r75365 | georg.brandl | 2009-10-11 22:16:16 +0200 (So, 11 Okt 2009) | 1 line
  Fix broken links found by "make linkcheck".  scipy.org seems to be done right now, so I could not verify links going there.
........
  r75394 | georg.brandl | 2009-10-13 20:10:59 +0200 (Di, 13 Okt 2009) | 1 line
  Fix markup.
........
  r75402 | georg.brandl | 2009-10-14 17:51:48 +0200 (Mi, 14 Okt 2009) | 1 line
  #7125: fix typo.
........
  r75403 | georg.brandl | 2009-10-14 17:57:46 +0200 (Mi, 14 Okt 2009) | 1 line
  #7126: os.environ changes *do* take effect in subprocesses started with os.system().
........
  r75418 | georg.brandl | 2009-10-14 20:48:32 +0200 (Mi, 14 Okt 2009) | 1 line
  #7116: str.join() takes an iterable.
........
  r75459 | georg.brandl | 2009-10-17 10:57:43 +0200 (Sa, 17 Okt 2009) | 1 line
  Fix refleaks in _ctypes PyCSimpleType_New, which fixes the refleak seen in test___all__.
........
  r75484 | georg.brandl | 2009-10-18 09:58:12 +0200 (So, 18 Okt 2009) | 1 line
  Fix missing word.
........
  r75592 | georg.brandl | 2009-10-22 09:05:48 +0200 (Do, 22 Okt 2009) | 1 line
  Fix punctuation.
........
  r75593 | georg.brandl | 2009-10-22 09:06:49 +0200 (Do, 22 Okt 2009) | 1 line
  Revert unintended change.
........
  r75594 | georg.brandl | 2009-10-22 09:56:02 +0200 (Do, 22 Okt 2009) | 1 line
  Fix markup.
........
  r75595 | georg.brandl | 2009-10-22 09:56:56 +0200 (Do, 22 Okt 2009) | 1 line
  Fix duplicate target.
........
  r75596 | georg.brandl | 2009-10-22 10:05:04 +0200 (Do, 22 Okt 2009) | 1 line
  Add a new directive marking up implementation details and start using it.
........
  r75600 | georg.brandl | 2009-10-22 13:01:46 +0200 (Do, 22 Okt 2009) | 1 line
  Make it more robust.
........
  r75602 | georg.brandl | 2009-10-22 13:28:06 +0200 (Do, 22 Okt 2009) | 1 line
  Document new directive.
........
  r75603 | georg.brandl | 2009-10-22 13:28:23 +0200 (Do, 22 Okt 2009) | 1 line
  Allow short form with text as argument.
........
  r75604 | georg.brandl | 2009-10-22 13:36:50 +0200 (Do, 22 Okt 2009) | 1 line
  Fix stylesheet for multi-paragraph impl-details.
........
  r75605 | georg.brandl | 2009-10-22 13:48:10 +0200 (Do, 22 Okt 2009) | 1 line
  Use "impl-detail" directive where applicable.
........
  r75606 | georg.brandl | 2009-10-22 17:00:06 +0200 (Do, 22 Okt 2009) | 1 line
  #6324: membership test tries iteration via __iter__.
........
  r75607 | georg.brandl | 2009-10-22 17:04:09 +0200 (Do, 22 Okt 2009) | 1 line
  #7088: document new functions in signal as Unix-only.
........
  r75610 | georg.brandl | 2009-10-22 17:27:24 +0200 (Do, 22 Okt 2009) | 1 line
  Reorder __slots__ fine print and add a clarification.
........
  r75611 | georg.brandl | 2009-10-22 17:42:32 +0200 (Do, 22 Okt 2009) | 1 line
  #7035: improve docs of the various <method>_errors() functions, and give them docstrings.
........
  r75612 | georg.brandl | 2009-10-22 17:52:15 +0200 (Do, 22 Okt 2009) | 1 line
  #7156: document curses as Unix-only.
........
  r75613 | georg.brandl | 2009-10-22 17:54:35 +0200 (Do, 22 Okt 2009) | 1 line
  #6977: getopt does not support optional option arguments.
........
  r75616 | georg.brandl | 2009-10-22 18:17:05 +0200 (Do, 22 Okt 2009) | 1 line
  Add proper references.
........
  r75617 | georg.brandl | 2009-10-22 18:20:55 +0200 (Do, 22 Okt 2009) | 1 line
  Make printout margin important.
........
  r75623 | georg.brandl | 2009-10-23 10:14:44 +0200 (Fr, 23 Okt 2009) | 1 line
  #7188: fix optionxform() docs.
........
  r75627 | fred.drake | 2009-10-23 15:04:51 +0200 (Fr, 23 Okt 2009) | 2 lines
  add further note about what's passed to optionxform
........
  r75640 | neil.schemenauer | 2009-10-23 21:58:17 +0200 (Fr, 23 Okt 2009) | 2 lines
  Improve some docstrings in the 'warnings' module.
........
  r75647 | georg.brandl | 2009-10-24 12:04:19 +0200 (Sa, 24 Okt 2009) | 1 line
  Fix markup.
........
  r75696 | georg.brandl | 2009-10-25 21:25:43 +0100 (So, 25 Okt 2009) | 1 line
  Fix a demo.
........
  r75795 | georg.brandl | 2009-10-27 16:10:22 +0100 (Di, 27 Okt 2009) | 1 line
  Fix a strange mis-edit.
........
											
										 
											2009-10-27 15:28:25 +00:00
										 |  |  | source code.  An alternative for creating API documentation purely from
 | 
					
						
							| 
									
										
										
										
											2014-10-29 10:57:37 +01:00
										 |  |  | docstrings is `epydoc <http://epydoc.sourceforge.net/>`_.  `Sphinx
 | 
					
						
							| 
									
										
										
										
											2014-10-29 09:24:54 +01:00
										 |  |  | <http://sphinx-doc.org>`_ can also include docstring content.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | How do I get a single keypress at a time?
 | 
					
						
							|  |  |  | -----------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  | For Unix variants there are several solutions.  It's straightforward to do this
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  | using curses, but curses is a fairly large module to learn.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. XXX this doesn't work out of the box, some IO expert needs to check why
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Here's a solution without curses::
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    import termios, fcntl, sys, os
 | 
					
						
							|  |  |  |    fd = sys.stdin.fileno()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    oldterm = termios.tcgetattr(fd)
 | 
					
						
							|  |  |  |    newattr = termios.tcgetattr(fd)
 | 
					
						
							|  |  |  |    newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
 | 
					
						
							|  |  |  |    termios.tcsetattr(fd, termios.TCSANOW, newattr)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
 | 
					
						
							|  |  |  |    fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    try:
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  |        while True:
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  |            try:
 | 
					
						
							|  |  |  |                c = sys.stdin.read(1)
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  |                print("Got character", repr(c))
 | 
					
						
							| 
									
										
										
										
											2012-12-18 23:16:44 +02:00
										 |  |  |            except OSError:
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  |                pass
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  |    finally:
 | 
					
						
							|  |  |  |        termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
 | 
					
						
							|  |  |  |        fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  |    You need the :mod:`termios` and the :mod:`fcntl` module for any of this to
 | 
					
						
							|  |  |  |    work, and I've only tried it on Linux, though it should work elsewhere.  In
 | 
					
						
							|  |  |  |    this code, characters are read and printed one at a time.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  |    :func:`termios.tcsetattr` turns off stdin's echoing and disables canonical
 | 
					
						
							|  |  |  |    mode.  :func:`fcntl.fnctl` is used to obtain stdin's file descriptor flags
 | 
					
						
							|  |  |  |    and modify them for non-blocking mode.  Since reading stdin when it is empty
 | 
					
						
							| 
									
										
										
										
											2012-12-18 23:16:44 +02:00
										 |  |  |    results in an :exc:`OSError`, this error is caught and ignored.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-19 13:45:30 +02:00
										 |  |  |    .. versionchanged:: 3.3
 | 
					
						
							|  |  |  |       *sys.stdin.read* used to raise :exc:`IOError`. Starting from Python 3.3
 | 
					
						
							|  |  |  |       :exc:`IOError` is alias for :exc:`OSError`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Threads
 | 
					
						
							|  |  |  | =======
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | How do I program using threads?
 | 
					
						
							|  |  |  | -------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-13 16:55:12 +00:00
										 |  |  | Be sure to use the :mod:`threading` module and not the :mod:`_thread` module.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | The :mod:`threading` module builds convenient abstractions on top of the
 | 
					
						
							| 
									
										
										
										
											2009-10-13 16:55:12 +00:00
										 |  |  | low-level primitives provided by the :mod:`_thread` module.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Aahz has a set of slides from his threading tutorial that are helpful; see
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 75365,75394,75402-75403,75418,75459,75484,75592-75596,75600,75602-75607,75610-75613,75616-75617,75623,75627,75640,75647,75696,75795 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r75365 | georg.brandl | 2009-10-11 22:16:16 +0200 (So, 11 Okt 2009) | 1 line
  Fix broken links found by "make linkcheck".  scipy.org seems to be done right now, so I could not verify links going there.
........
  r75394 | georg.brandl | 2009-10-13 20:10:59 +0200 (Di, 13 Okt 2009) | 1 line
  Fix markup.
........
  r75402 | georg.brandl | 2009-10-14 17:51:48 +0200 (Mi, 14 Okt 2009) | 1 line
  #7125: fix typo.
........
  r75403 | georg.brandl | 2009-10-14 17:57:46 +0200 (Mi, 14 Okt 2009) | 1 line
  #7126: os.environ changes *do* take effect in subprocesses started with os.system().
........
  r75418 | georg.brandl | 2009-10-14 20:48:32 +0200 (Mi, 14 Okt 2009) | 1 line
  #7116: str.join() takes an iterable.
........
  r75459 | georg.brandl | 2009-10-17 10:57:43 +0200 (Sa, 17 Okt 2009) | 1 line
  Fix refleaks in _ctypes PyCSimpleType_New, which fixes the refleak seen in test___all__.
........
  r75484 | georg.brandl | 2009-10-18 09:58:12 +0200 (So, 18 Okt 2009) | 1 line
  Fix missing word.
........
  r75592 | georg.brandl | 2009-10-22 09:05:48 +0200 (Do, 22 Okt 2009) | 1 line
  Fix punctuation.
........
  r75593 | georg.brandl | 2009-10-22 09:06:49 +0200 (Do, 22 Okt 2009) | 1 line
  Revert unintended change.
........
  r75594 | georg.brandl | 2009-10-22 09:56:02 +0200 (Do, 22 Okt 2009) | 1 line
  Fix markup.
........
  r75595 | georg.brandl | 2009-10-22 09:56:56 +0200 (Do, 22 Okt 2009) | 1 line
  Fix duplicate target.
........
  r75596 | georg.brandl | 2009-10-22 10:05:04 +0200 (Do, 22 Okt 2009) | 1 line
  Add a new directive marking up implementation details and start using it.
........
  r75600 | georg.brandl | 2009-10-22 13:01:46 +0200 (Do, 22 Okt 2009) | 1 line
  Make it more robust.
........
  r75602 | georg.brandl | 2009-10-22 13:28:06 +0200 (Do, 22 Okt 2009) | 1 line
  Document new directive.
........
  r75603 | georg.brandl | 2009-10-22 13:28:23 +0200 (Do, 22 Okt 2009) | 1 line
  Allow short form with text as argument.
........
  r75604 | georg.brandl | 2009-10-22 13:36:50 +0200 (Do, 22 Okt 2009) | 1 line
  Fix stylesheet for multi-paragraph impl-details.
........
  r75605 | georg.brandl | 2009-10-22 13:48:10 +0200 (Do, 22 Okt 2009) | 1 line
  Use "impl-detail" directive where applicable.
........
  r75606 | georg.brandl | 2009-10-22 17:00:06 +0200 (Do, 22 Okt 2009) | 1 line
  #6324: membership test tries iteration via __iter__.
........
  r75607 | georg.brandl | 2009-10-22 17:04:09 +0200 (Do, 22 Okt 2009) | 1 line
  #7088: document new functions in signal as Unix-only.
........
  r75610 | georg.brandl | 2009-10-22 17:27:24 +0200 (Do, 22 Okt 2009) | 1 line
  Reorder __slots__ fine print and add a clarification.
........
  r75611 | georg.brandl | 2009-10-22 17:42:32 +0200 (Do, 22 Okt 2009) | 1 line
  #7035: improve docs of the various <method>_errors() functions, and give them docstrings.
........
  r75612 | georg.brandl | 2009-10-22 17:52:15 +0200 (Do, 22 Okt 2009) | 1 line
  #7156: document curses as Unix-only.
........
  r75613 | georg.brandl | 2009-10-22 17:54:35 +0200 (Do, 22 Okt 2009) | 1 line
  #6977: getopt does not support optional option arguments.
........
  r75616 | georg.brandl | 2009-10-22 18:17:05 +0200 (Do, 22 Okt 2009) | 1 line
  Add proper references.
........
  r75617 | georg.brandl | 2009-10-22 18:20:55 +0200 (Do, 22 Okt 2009) | 1 line
  Make printout margin important.
........
  r75623 | georg.brandl | 2009-10-23 10:14:44 +0200 (Fr, 23 Okt 2009) | 1 line
  #7188: fix optionxform() docs.
........
  r75627 | fred.drake | 2009-10-23 15:04:51 +0200 (Fr, 23 Okt 2009) | 2 lines
  add further note about what's passed to optionxform
........
  r75640 | neil.schemenauer | 2009-10-23 21:58:17 +0200 (Fr, 23 Okt 2009) | 2 lines
  Improve some docstrings in the 'warnings' module.
........
  r75647 | georg.brandl | 2009-10-24 12:04:19 +0200 (Sa, 24 Okt 2009) | 1 line
  Fix markup.
........
  r75696 | georg.brandl | 2009-10-25 21:25:43 +0100 (So, 25 Okt 2009) | 1 line
  Fix a demo.
........
  r75795 | georg.brandl | 2009-10-27 16:10:22 +0100 (Di, 27 Okt 2009) | 1 line
  Fix a strange mis-edit.
........
											
										 
											2009-10-27 15:28:25 +00:00
										 |  |  | http://www.pythoncraft.com/OSCON2001/.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | None of my threads seem to run: why?
 | 
					
						
							|  |  |  | ------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | As soon as the main thread exits, all threads are killed.  Your main thread is
 | 
					
						
							|  |  |  | running too quickly, giving the threads no time to do any work.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | A simple fix is to add a sleep to the end of the program that's long enough for
 | 
					
						
							|  |  |  | all the threads to finish::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    import threading, time
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    def thread_task(name, n):
 | 
					
						
							| 
									
										
										
										
											2016-05-10 12:01:23 +03:00
										 |  |  |        for i in range(n):
 | 
					
						
							|  |  |  |            print(name, i)
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    for i in range(10):
 | 
					
						
							|  |  |  |        T = threading.Thread(target=thread_task, args=(str(i), i))
 | 
					
						
							|  |  |  |        T.start()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  |    time.sleep(10)  # <---------------------------!
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | But now (on many platforms) the threads don't run in parallel, but appear to run
 | 
					
						
							|  |  |  | sequentially, one at a time!  The reason is that the OS thread scheduler doesn't
 | 
					
						
							|  |  |  | start a new thread until the previous thread is blocked.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | A simple fix is to add a tiny sleep to the start of the run function::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    def thread_task(name, n):
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  |        time.sleep(0.001)  # <--------------------!
 | 
					
						
							| 
									
										
										
										
											2016-05-10 12:01:23 +03:00
										 |  |  |        for i in range(n):
 | 
					
						
							|  |  |  |            print(name, i)
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    for i in range(10):
 | 
					
						
							|  |  |  |        T = threading.Thread(target=thread_task, args=(str(i), i))
 | 
					
						
							|  |  |  |        T.start()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    time.sleep(10)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  | Instead of trying to guess a good delay value for :func:`time.sleep`,
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | it's better to use some kind of semaphore mechanism.  One idea is to use the
 | 
					
						
							| 
									
										
										
										
											2009-10-13 16:55:12 +00:00
										 |  |  | :mod:`queue` module to create a queue object, let each thread append a token to
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | the queue when it finishes, and let the main thread read as many tokens from the
 | 
					
						
							|  |  |  | queue as there are threads.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | How do I parcel out work among a bunch of worker threads?
 | 
					
						
							|  |  |  | ---------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-05 11:18:34 +00:00
										 |  |  | The easiest way is to use the new :mod:`concurrent.futures` module,
 | 
					
						
							|  |  |  | especially the :mod:`~concurrent.futures.ThreadPoolExecutor` class.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Or, if you want fine control over the dispatching algorithm, you can write
 | 
					
						
							|  |  |  | your own logic manually.  Use the :mod:`queue` module to create a queue
 | 
					
						
							|  |  |  | containing a list of jobs.  The :class:`~queue.Queue` class maintains a
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  | list of objects and has a ``.put(obj)`` method that adds items to the queue and
 | 
					
						
							|  |  |  | a ``.get()`` method to return them.  The class will take care of the locking
 | 
					
						
							|  |  |  | necessary to ensure that each job is handed out exactly once.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Here's a trivial example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  |    import threading, queue, time
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    # The worker thread gets jobs off the queue.  When the queue is empty, it
 | 
					
						
							|  |  |  |    # assumes there will be no more work and exits.
 | 
					
						
							|  |  |  |    # (Realistically workers will run until terminated.)
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  |    def worker():
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  |        print('Running worker')
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  |        time.sleep(0.1)
 | 
					
						
							|  |  |  |        while True:
 | 
					
						
							|  |  |  |            try:
 | 
					
						
							|  |  |  |                arg = q.get(block=False)
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  |            except queue.Empty:
 | 
					
						
							|  |  |  |                print('Worker', threading.currentThread(), end=' ')
 | 
					
						
							|  |  |  |                print('queue empty')
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  |                break
 | 
					
						
							|  |  |  |            else:
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  |                print('Worker', threading.currentThread(), end=' ')
 | 
					
						
							|  |  |  |                print('running with argument', arg)
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  |                time.sleep(0.5)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    # Create queue
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  |    q = queue.Queue()
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    # Start a pool of 5 workers
 | 
					
						
							|  |  |  |    for i in range(5):
 | 
					
						
							|  |  |  |        t = threading.Thread(target=worker, name='worker %i' % (i+1))
 | 
					
						
							|  |  |  |        t.start()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    # Begin adding work to the queue
 | 
					
						
							|  |  |  |    for i in range(50):
 | 
					
						
							|  |  |  |        q.put(i)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    # Give threads time to run
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  |    print('Main thread sleeping')
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  |    time.sleep(5)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  | When run, this will produce the following output:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. code-block:: none
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Running worker
 | 
					
						
							|  |  |  |    Running worker
 | 
					
						
							|  |  |  |    Running worker
 | 
					
						
							|  |  |  |    Running worker
 | 
					
						
							|  |  |  |    Running worker
 | 
					
						
							|  |  |  |    Main thread sleeping
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  |    Worker <Thread(worker 1, started 130283832797456)> running with argument 0
 | 
					
						
							|  |  |  |    Worker <Thread(worker 2, started 130283824404752)> running with argument 1
 | 
					
						
							|  |  |  |    Worker <Thread(worker 3, started 130283816012048)> running with argument 2
 | 
					
						
							|  |  |  |    Worker <Thread(worker 4, started 130283807619344)> running with argument 3
 | 
					
						
							|  |  |  |    Worker <Thread(worker 5, started 130283799226640)> running with argument 4
 | 
					
						
							|  |  |  |    Worker <Thread(worker 1, started 130283832797456)> running with argument 5
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  |    ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-30 22:03:20 +02:00
										 |  |  | Consult the module's documentation for more details; the :class:`~queue.Queue`
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  | class provides a featureful interface.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | What kinds of global value mutation are thread-safe?
 | 
					
						
							|  |  |  | ----------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-05 11:18:34 +00:00
										 |  |  | A :term:`global interpreter lock` (GIL) is used internally to ensure that only one
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | thread runs in the Python VM at a time.  In general, Python offers to switch
 | 
					
						
							|  |  |  | among threads only between bytecode instructions; how frequently it switches can
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  | be set via :func:`sys.setswitchinterval`.  Each bytecode instruction and
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | therefore all the C implementation code reached from each instruction is
 | 
					
						
							|  |  |  | therefore atomic from the point of view of a Python program.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | In theory, this means an exact accounting requires an exact understanding of the
 | 
					
						
							|  |  |  | PVM bytecode implementation.  In practice, it means that operations on shared
 | 
					
						
							| 
									
										
										
										
											2010-02-06 18:46:57 +00:00
										 |  |  | variables of built-in data types (ints, lists, dicts, etc) that "look atomic"
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | really are.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | For example, the following operations are all atomic (L, L1, L2 are lists, D,
 | 
					
						
							|  |  |  | D1, D2 are dicts, x, y are objects, i, j are ints)::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    L.append(x)
 | 
					
						
							|  |  |  |    L1.extend(L2)
 | 
					
						
							|  |  |  |    x = L[i]
 | 
					
						
							|  |  |  |    x = L.pop()
 | 
					
						
							|  |  |  |    L1[i:j] = L2
 | 
					
						
							|  |  |  |    L.sort()
 | 
					
						
							|  |  |  |    x = y
 | 
					
						
							|  |  |  |    x.field = y
 | 
					
						
							|  |  |  |    D[x] = y
 | 
					
						
							|  |  |  |    D1.update(D2)
 | 
					
						
							|  |  |  |    D.keys()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | These aren't::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    i = i+1
 | 
					
						
							|  |  |  |    L.append(L[-1])
 | 
					
						
							|  |  |  |    L[i] = L[j]
 | 
					
						
							|  |  |  |    D[x] = D[x] + 1
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Operations that replace other objects may invoke those other objects'
 | 
					
						
							|  |  |  | :meth:`__del__` method when their reference count reaches zero, and that can
 | 
					
						
							|  |  |  | affect things.  This is especially true for the mass updates to dictionaries and
 | 
					
						
							|  |  |  | lists.  When in doubt, use a mutex!
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Can't we get rid of the Global Interpreter Lock?
 | 
					
						
							|  |  |  | ------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 75365,75394,75402-75403,75418,75459,75484,75592-75596,75600,75602-75607,75610-75613,75616-75617,75623,75627,75640,75647,75696,75795 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r75365 | georg.brandl | 2009-10-11 22:16:16 +0200 (So, 11 Okt 2009) | 1 line
  Fix broken links found by "make linkcheck".  scipy.org seems to be done right now, so I could not verify links going there.
........
  r75394 | georg.brandl | 2009-10-13 20:10:59 +0200 (Di, 13 Okt 2009) | 1 line
  Fix markup.
........
  r75402 | georg.brandl | 2009-10-14 17:51:48 +0200 (Mi, 14 Okt 2009) | 1 line
  #7125: fix typo.
........
  r75403 | georg.brandl | 2009-10-14 17:57:46 +0200 (Mi, 14 Okt 2009) | 1 line
  #7126: os.environ changes *do* take effect in subprocesses started with os.system().
........
  r75418 | georg.brandl | 2009-10-14 20:48:32 +0200 (Mi, 14 Okt 2009) | 1 line
  #7116: str.join() takes an iterable.
........
  r75459 | georg.brandl | 2009-10-17 10:57:43 +0200 (Sa, 17 Okt 2009) | 1 line
  Fix refleaks in _ctypes PyCSimpleType_New, which fixes the refleak seen in test___all__.
........
  r75484 | georg.brandl | 2009-10-18 09:58:12 +0200 (So, 18 Okt 2009) | 1 line
  Fix missing word.
........
  r75592 | georg.brandl | 2009-10-22 09:05:48 +0200 (Do, 22 Okt 2009) | 1 line
  Fix punctuation.
........
  r75593 | georg.brandl | 2009-10-22 09:06:49 +0200 (Do, 22 Okt 2009) | 1 line
  Revert unintended change.
........
  r75594 | georg.brandl | 2009-10-22 09:56:02 +0200 (Do, 22 Okt 2009) | 1 line
  Fix markup.
........
  r75595 | georg.brandl | 2009-10-22 09:56:56 +0200 (Do, 22 Okt 2009) | 1 line
  Fix duplicate target.
........
  r75596 | georg.brandl | 2009-10-22 10:05:04 +0200 (Do, 22 Okt 2009) | 1 line
  Add a new directive marking up implementation details and start using it.
........
  r75600 | georg.brandl | 2009-10-22 13:01:46 +0200 (Do, 22 Okt 2009) | 1 line
  Make it more robust.
........
  r75602 | georg.brandl | 2009-10-22 13:28:06 +0200 (Do, 22 Okt 2009) | 1 line
  Document new directive.
........
  r75603 | georg.brandl | 2009-10-22 13:28:23 +0200 (Do, 22 Okt 2009) | 1 line
  Allow short form with text as argument.
........
  r75604 | georg.brandl | 2009-10-22 13:36:50 +0200 (Do, 22 Okt 2009) | 1 line
  Fix stylesheet for multi-paragraph impl-details.
........
  r75605 | georg.brandl | 2009-10-22 13:48:10 +0200 (Do, 22 Okt 2009) | 1 line
  Use "impl-detail" directive where applicable.
........
  r75606 | georg.brandl | 2009-10-22 17:00:06 +0200 (Do, 22 Okt 2009) | 1 line
  #6324: membership test tries iteration via __iter__.
........
  r75607 | georg.brandl | 2009-10-22 17:04:09 +0200 (Do, 22 Okt 2009) | 1 line
  #7088: document new functions in signal as Unix-only.
........
  r75610 | georg.brandl | 2009-10-22 17:27:24 +0200 (Do, 22 Okt 2009) | 1 line
  Reorder __slots__ fine print and add a clarification.
........
  r75611 | georg.brandl | 2009-10-22 17:42:32 +0200 (Do, 22 Okt 2009) | 1 line
  #7035: improve docs of the various <method>_errors() functions, and give them docstrings.
........
  r75612 | georg.brandl | 2009-10-22 17:52:15 +0200 (Do, 22 Okt 2009) | 1 line
  #7156: document curses as Unix-only.
........
  r75613 | georg.brandl | 2009-10-22 17:54:35 +0200 (Do, 22 Okt 2009) | 1 line
  #6977: getopt does not support optional option arguments.
........
  r75616 | georg.brandl | 2009-10-22 18:17:05 +0200 (Do, 22 Okt 2009) | 1 line
  Add proper references.
........
  r75617 | georg.brandl | 2009-10-22 18:20:55 +0200 (Do, 22 Okt 2009) | 1 line
  Make printout margin important.
........
  r75623 | georg.brandl | 2009-10-23 10:14:44 +0200 (Fr, 23 Okt 2009) | 1 line
  #7188: fix optionxform() docs.
........
  r75627 | fred.drake | 2009-10-23 15:04:51 +0200 (Fr, 23 Okt 2009) | 2 lines
  add further note about what's passed to optionxform
........
  r75640 | neil.schemenauer | 2009-10-23 21:58:17 +0200 (Fr, 23 Okt 2009) | 2 lines
  Improve some docstrings in the 'warnings' module.
........
  r75647 | georg.brandl | 2009-10-24 12:04:19 +0200 (Sa, 24 Okt 2009) | 1 line
  Fix markup.
........
  r75696 | georg.brandl | 2009-10-25 21:25:43 +0100 (So, 25 Okt 2009) | 1 line
  Fix a demo.
........
  r75795 | georg.brandl | 2009-10-27 16:10:22 +0100 (Di, 27 Okt 2009) | 1 line
  Fix a strange mis-edit.
........
											
										 
											2009-10-27 15:28:25 +00:00
										 |  |  | .. XXX link to dbeazley's talk about GIL?
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-05 11:18:34 +00:00
										 |  |  | The :term:`global interpreter lock` (GIL) is often seen as a hindrance to Python's
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | deployment on high-end multiprocessor server machines, because a multi-threaded
 | 
					
						
							|  |  |  | Python program effectively only uses one CPU, due to the insistence that
 | 
					
						
							|  |  |  | (almost) all Python code can only run while the GIL is held.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Back in the days of Python 1.5, Greg Stein actually implemented a comprehensive
 | 
					
						
							|  |  |  | patch set (the "free threading" patches) that removed the GIL and replaced it
 | 
					
						
							| 
									
										
										
										
											2011-02-05 11:18:34 +00:00
										 |  |  | with fine-grained locking.  Adam Olsen recently did a similar experiment
 | 
					
						
							|  |  |  | in his `python-safethread <http://code.google.com/p/python-safethread/>`_
 | 
					
						
							|  |  |  | project.  Unfortunately, both experiments exhibited a sharp drop in single-thread
 | 
					
						
							|  |  |  | performance (at least 30% slower), due to the amount of fine-grained locking
 | 
					
						
							|  |  |  | necessary to compensate for the removal of the GIL.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | This doesn't mean that you can't make good use of Python on multi-CPU machines!
 | 
					
						
							|  |  |  | You just have to be creative with dividing the work up between multiple
 | 
					
						
							| 
									
										
										
										
											2011-02-05 11:18:34 +00:00
										 |  |  | *processes* rather than multiple *threads*.  The
 | 
					
						
							|  |  |  | :class:`~concurrent.futures.ProcessPoolExecutor` class in the new
 | 
					
						
							|  |  |  | :mod:`concurrent.futures` module provides an easy way of doing so; the
 | 
					
						
							|  |  |  | :mod:`multiprocessing` module provides a lower-level API in case you want
 | 
					
						
							|  |  |  | more control over dispatching of tasks.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Judicious use of C extensions will also help; if you use a C extension to
 | 
					
						
							|  |  |  | perform a time-consuming task, the extension can release the GIL while the
 | 
					
						
							|  |  |  | thread of execution is in the C code and allow other threads to get some work
 | 
					
						
							|  |  |  | done.  Some standard library modules such as :mod:`zlib` and :mod:`hashlib`
 | 
					
						
							|  |  |  | already do this.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | It has been suggested that the GIL should be a per-interpreter-state lock rather
 | 
					
						
							|  |  |  | than truly global; interpreters then wouldn't be able to share objects.
 | 
					
						
							|  |  |  | Unfortunately, this isn't likely to happen either.  It would be a tremendous
 | 
					
						
							|  |  |  | amount of work, because many object implementations currently have global state.
 | 
					
						
							|  |  |  | For example, small integers and short strings are cached; these caches would
 | 
					
						
							|  |  |  | have to be moved to the interpreter state.  Other object types have their own
 | 
					
						
							|  |  |  | free list; these free lists would have to be moved to the interpreter state.
 | 
					
						
							|  |  |  | And so on.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | And I doubt that it can even be done in finite time, because the same problem
 | 
					
						
							|  |  |  | exists for 3rd party extensions.  It is likely that 3rd party extensions are
 | 
					
						
							|  |  |  | being written at a faster rate than you can convert them to store all their
 | 
					
						
							|  |  |  | global state in the interpreter state.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | And finally, once you have multiple interpreters not sharing any state, what
 | 
					
						
							|  |  |  | have you gained over running each interpreter in a separate process?
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Input and Output
 | 
					
						
							|  |  |  | ================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | How do I delete a file? (And other file questions...)
 | 
					
						
							|  |  |  | -----------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Use ``os.remove(filename)`` or ``os.unlink(filename)``; for documentation, see
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  | the :mod:`os` module.  The two functions are identical; :func:`~os.unlink` is simply
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | the name of the Unix system call for this function.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To remove a directory, use :func:`os.rmdir`; use :func:`os.mkdir` to create one.
 | 
					
						
							|  |  |  | ``os.makedirs(path)`` will create any intermediate directories in ``path`` that
 | 
					
						
							|  |  |  | don't exist. ``os.removedirs(path)`` will remove intermediate directories as
 | 
					
						
							|  |  |  | long as they're empty; if you want to delete an entire directory tree and its
 | 
					
						
							|  |  |  | contents, use :func:`shutil.rmtree`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To rename a file, use ``os.rename(old_path, new_path)``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-15 10:08:31 +00:00
										 |  |  | To truncate a file, open it using ``f = open(filename, "rb+")``, and use
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | ``f.truncate(offset)``; offset defaults to the current seek position.  There's
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:26:05 +00:00
										 |  |  | also ``os.ftruncate(fd, offset)`` for files opened with :func:`os.open`, where
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  | *fd* is the file descriptor (a small integer).
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | The :mod:`shutil` module also contains a number of functions to work on files
 | 
					
						
							|  |  |  | including :func:`~shutil.copyfile`, :func:`~shutil.copytree`, and
 | 
					
						
							|  |  |  | :func:`~shutil.rmtree`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | How do I copy a file?
 | 
					
						
							|  |  |  | ---------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The :mod:`shutil` module contains a :func:`~shutil.copyfile` function.  Note
 | 
					
						
							|  |  |  | that on MacOS 9 it doesn't copy the resource fork and Finder info.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | How do I read (or write) binary data?
 | 
					
						
							|  |  |  | -------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To read or write complex binary data formats, it's best to use the :mod:`struct`
 | 
					
						
							|  |  |  | module.  It allows you to take a string containing binary data (usually numbers)
 | 
					
						
							|  |  |  | and convert it to Python objects; and vice versa.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | For example, the following code reads two 2-byte integers and one 4-byte integer
 | 
					
						
							|  |  |  | in big-endian format from a file::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    import struct
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-15 10:08:31 +00:00
										 |  |  |    with open(filename, "rb") as f:
 | 
					
						
							| 
									
										
										
										
											2016-05-10 12:01:23 +03:00
										 |  |  |        s = f.read(8)
 | 
					
						
							|  |  |  |        x, y, z = struct.unpack(">hhl", s)
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | The '>' in the format string forces big-endian data; the letter 'h' reads one
 | 
					
						
							|  |  |  | "short integer" (2 bytes), and 'l' reads one "long integer" (4 bytes) from the
 | 
					
						
							|  |  |  | string.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  | For data that is more regular (e.g. a homogeneous list of ints or floats),
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | you can also use the :mod:`array` module.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  | .. note::
 | 
					
						
							| 
									
										
										
										
											2014-03-15 21:13:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  |    To read and write binary data, it is mandatory to open the file in
 | 
					
						
							|  |  |  |    binary mode (here, passing ``"rb"`` to :func:`open`).  If you use
 | 
					
						
							|  |  |  |    ``"r"`` instead (the default), the file will be open in text mode
 | 
					
						
							|  |  |  |    and ``f.read()`` will return :class:`str` objects rather than
 | 
					
						
							|  |  |  |    :class:`bytes` objects.
 | 
					
						
							| 
									
										
										
										
											2010-09-15 10:08:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | I can't seem to use os.read() on a pipe created with os.popen(); why?
 | 
					
						
							|  |  |  | ---------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :func:`os.read` is a low-level function which takes a file descriptor, a small
 | 
					
						
							|  |  |  | integer representing the opened file.  :func:`os.popen` creates a high-level
 | 
					
						
							| 
									
										
										
										
											2010-02-06 18:46:57 +00:00
										 |  |  | file object, the same type returned by the built-in :func:`open` function.
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  | Thus, to read *n* bytes from a pipe *p* created with :func:`os.popen`, you need to
 | 
					
						
							| 
									
										
										
										
											2010-02-06 18:46:57 +00:00
										 |  |  | use ``p.read(n)``.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  | .. XXX update to use subprocess. See the :ref:`subprocess-replacements` section.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    How do I run a subprocess with pipes connected to both input and output?
 | 
					
						
							|  |  |  |    ------------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Use the :mod:`popen2` module.  For example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       import popen2
 | 
					
						
							|  |  |  |       fromchild, tochild = popen2.popen2("command")
 | 
					
						
							|  |  |  |       tochild.write("input\n")
 | 
					
						
							|  |  |  |       tochild.flush()
 | 
					
						
							|  |  |  |       output = fromchild.readline()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Warning: in general it is unwise to do this because you can easily cause a
 | 
					
						
							|  |  |  |    deadlock where your process is blocked waiting for output from the child
 | 
					
						
							|  |  |  |    while the child is blocked waiting for input from you.  This can be caused
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  |    by the parent expecting the child to output more text than it does or
 | 
					
						
							|  |  |  |    by data being stuck in stdio buffers due to lack of flushing.
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  |    The Python parent can of course explicitly flush the data it sends to the
 | 
					
						
							|  |  |  |    child before it reads any output, but if the child is a naive C program it
 | 
					
						
							|  |  |  |    may have been written to never explicitly flush its output, even if it is
 | 
					
						
							|  |  |  |    interactive, since flushing is normally automatic.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Note that a deadlock is also possible if you use :func:`popen3` to read
 | 
					
						
							|  |  |  |    stdout and stderr. If one of the two is too large for the internal buffer
 | 
					
						
							|  |  |  |    (increasing the buffer size does not help) and you ``read()`` the other one
 | 
					
						
							|  |  |  |    first, there is a deadlock, too.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Note on a bug in popen2: unless your program calls ``wait()`` or
 | 
					
						
							|  |  |  |    ``waitpid()``, finished child processes are never removed, and eventually
 | 
					
						
							|  |  |  |    calls to popen2 will fail because of a limit on the number of child
 | 
					
						
							|  |  |  |    processes.  Calling :func:`os.waitpid` with the :data:`os.WNOHANG` option can
 | 
					
						
							|  |  |  |    prevent this; a good place to insert such a call would be before calling
 | 
					
						
							|  |  |  |    ``popen2`` again.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    In many cases, all you really need is to run some data through a command and
 | 
					
						
							|  |  |  |    get the result back.  Unless the amount of data is very large, the easiest
 | 
					
						
							|  |  |  |    way to do this is to write it to a temporary file and run the command with
 | 
					
						
							|  |  |  |    that temporary file as input.  The standard module :mod:`tempfile` exports a
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  |    :func:`~tempfile.mktemp` function to generate unique temporary file names. ::
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       import tempfile
 | 
					
						
							|  |  |  |       import os
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class Popen3:
 | 
					
						
							|  |  |  |           """
 | 
					
						
							|  |  |  |           This is a deadlock-safe version of popen that returns
 | 
					
						
							|  |  |  |           an object with errorlevel, out (a string) and err (a string).
 | 
					
						
							|  |  |  |           (capturestderr may not work under windows.)
 | 
					
						
							|  |  |  |           Example: print(Popen3('grep spam','\n\nhere spam\n\n').out)
 | 
					
						
							|  |  |  |           """
 | 
					
						
							|  |  |  |           def __init__(self,command,input=None,capturestderr=None):
 | 
					
						
							|  |  |  |               outfile=tempfile.mktemp()
 | 
					
						
							|  |  |  |               command="( %s ) > %s" % (command,outfile)
 | 
					
						
							|  |  |  |               if input:
 | 
					
						
							|  |  |  |                   infile=tempfile.mktemp()
 | 
					
						
							|  |  |  |                   open(infile,"w").write(input)
 | 
					
						
							|  |  |  |                   command=command+" <"+infile
 | 
					
						
							|  |  |  |               if capturestderr:
 | 
					
						
							|  |  |  |                   errfile=tempfile.mktemp()
 | 
					
						
							|  |  |  |                   command=command+" 2>"+errfile
 | 
					
						
							|  |  |  |               self.errorlevel=os.system(command) >> 8
 | 
					
						
							|  |  |  |               self.out=open(outfile,"r").read()
 | 
					
						
							|  |  |  |               os.remove(outfile)
 | 
					
						
							|  |  |  |               if input:
 | 
					
						
							|  |  |  |                   os.remove(infile)
 | 
					
						
							|  |  |  |               if capturestderr:
 | 
					
						
							|  |  |  |                   self.err=open(errfile,"r").read()
 | 
					
						
							|  |  |  |                   os.remove(errfile)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Note that many interactive programs (e.g. vi) don't work well with pipes
 | 
					
						
							|  |  |  |    substituted for standard input and output.  You will have to use pseudo ttys
 | 
					
						
							|  |  |  |    ("ptys") instead of pipes. Or you can use a Python interface to Don Libes'
 | 
					
						
							|  |  |  |    "expect" library.  A Python extension that interfaces to expect is called
 | 
					
						
							|  |  |  |    "expy" and available from http://expectpy.sourceforge.net.  A pure Python
 | 
					
						
							|  |  |  |    solution that works like expect is `pexpect
 | 
					
						
							| 
									
										
										
										
											2014-10-29 08:36:35 +01:00
										 |  |  |    <https://pypi.python.org/pypi/pexpect/>`_.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | How do I access the serial (RS232) port?
 | 
					
						
							|  |  |  | ----------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | For Win32, POSIX (Linux, BSD, etc.), Jython:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    http://pyserial.sourceforge.net
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | For Unix, see a Usenet post by Mitch Chapman:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-26 19:37:12 +01:00
										 |  |  |    https://groups.google.com/groups?selm=34A04430.CF9@ohioee.com
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Why doesn't closing sys.stdout (stdin, stderr) really close it?
 | 
					
						
							|  |  |  | ---------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-15 10:08:31 +00:00
										 |  |  | Python :term:`file objects <file object>` are a high-level layer of
 | 
					
						
							|  |  |  | abstraction on low-level C file descriptors.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-15 10:08:31 +00:00
										 |  |  | For most file objects you create in Python via the built-in :func:`open`
 | 
					
						
							|  |  |  | function, ``f.close()`` marks the Python file object as being closed from
 | 
					
						
							|  |  |  | Python's point of view, and also arranges to close the underlying C file
 | 
					
						
							|  |  |  | descriptor.  This also happens automatically in ``f``'s destructor, when
 | 
					
						
							|  |  |  | ``f`` becomes garbage.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | But stdin, stdout and stderr are treated specially by Python, because of the
 | 
					
						
							|  |  |  | special status also given to them by C.  Running ``sys.stdout.close()`` marks
 | 
					
						
							|  |  |  | the Python-level file object as being closed, but does *not* close the
 | 
					
						
							| 
									
										
										
										
											2010-09-15 10:08:31 +00:00
										 |  |  | associated C file descriptor.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To close the underlying C file descriptor for one of these three, you should
 | 
					
						
							|  |  |  | first be sure that's what you really want to do (e.g., you may confuse
 | 
					
						
							|  |  |  | extension modules trying to do I/O).  If it is, use :func:`os.close`::
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-15 10:08:31 +00:00
										 |  |  |    os.close(stdin.fileno())
 | 
					
						
							|  |  |  |    os.close(stdout.fileno())
 | 
					
						
							|  |  |  |    os.close(stderr.fileno())
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-15 10:08:31 +00:00
										 |  |  | Or you can use the numeric constants 0, 1 and 2, respectively.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Network/Internet Programming
 | 
					
						
							|  |  |  | ============================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | What WWW tools are there for Python?
 | 
					
						
							|  |  |  | ------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | See the chapters titled :ref:`internet` and :ref:`netdata` in the Library
 | 
					
						
							|  |  |  | Reference Manual.  Python has many modules that will help you build server-side
 | 
					
						
							|  |  |  | and client-side web systems.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. XXX check if wiki page is still up to date
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | A summary of available frameworks is maintained by Paul Boddie at
 | 
					
						
							| 
									
										
										
										
											2014-10-29 08:36:35 +01:00
										 |  |  | https://wiki.python.org/moin/WebProgramming\ .
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Cameron Laird maintains a useful set of pages about Python web technologies at
 | 
					
						
							|  |  |  | http://phaseit.net/claird/comp.lang.python/web_python.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | How can I mimic CGI form submission (METHOD=POST)?
 | 
					
						
							|  |  |  | --------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | I would like to retrieve web pages that are the result of POSTing a form. Is
 | 
					
						
							|  |  |  | there existing code that would let me do this easily?
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  | Yes. Here's a simple example that uses urllib.request::
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    #!/usr/local/bin/python
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  |    import urllib.request
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-10 12:01:23 +03:00
										 |  |  |    # build the query string
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  |    qs = "First=Josephine&MI=Q&Last=Public"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-10 12:01:23 +03:00
										 |  |  |    # connect and send the server a path
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  |    req = urllib.request.urlopen('http://www.some-server.out-there'
 | 
					
						
							|  |  |  |                                 '/cgi-bin/some-cgi-script', data=qs)
 | 
					
						
							| 
									
										
										
										
											2015-04-12 13:52:49 +03:00
										 |  |  |    with req:
 | 
					
						
							|  |  |  |        msg, hdrs = req.read(), req.info()
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-14 15:48:49 +00:00
										 |  |  | Note that in general for percent-encoded POST operations, query strings must be
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  | quoted using :func:`urllib.parse.urlencode`.  For example, to send
 | 
					
						
							|  |  |  | ``name=Guy Steele, Jr.``::
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  |    >>> import urllib.parse
 | 
					
						
							|  |  |  |    >>> urllib.parse.urlencode({'name': 'Guy Steele, Jr.'})
 | 
					
						
							|  |  |  |    'name=Guy+Steele%2C+Jr.'
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-28 00:00:58 +03:00
										 |  |  | .. seealso:: :ref:`urllib-howto` for extensive examples.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | What module should I use to help with generating HTML?
 | 
					
						
							|  |  |  | ------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. XXX add modern template languages
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  | You can find a collection of useful links on the `Web Programming wiki page
 | 
					
						
							| 
									
										
										
										
											2014-10-29 08:36:35 +01:00
										 |  |  | <https://wiki.python.org/moin/WebProgramming>`_.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | How do I send mail from a Python script?
 | 
					
						
							|  |  |  | ----------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Use the standard library module :mod:`smtplib`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Here's a very simple interactive mail sender that uses it.  This method will
 | 
					
						
							|  |  |  | work on any host that supports an SMTP listener. ::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    import sys, smtplib
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  |    fromaddr = input("From: ")
 | 
					
						
							|  |  |  |    toaddrs  = input("To: ").split(',')
 | 
					
						
							|  |  |  |    print("Enter message, end with ^D:")
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  |    msg = ''
 | 
					
						
							|  |  |  |    while True:
 | 
					
						
							|  |  |  |        line = sys.stdin.readline()
 | 
					
						
							|  |  |  |        if not line:
 | 
					
						
							|  |  |  |            break
 | 
					
						
							|  |  |  |        msg += line
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    # The actual mail send
 | 
					
						
							|  |  |  |    server = smtplib.SMTP('localhost')
 | 
					
						
							|  |  |  |    server.sendmail(fromaddr, toaddrs, msg)
 | 
					
						
							|  |  |  |    server.quit()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | A Unix-only alternative uses sendmail.  The location of the sendmail program
 | 
					
						
							| 
									
										
										
										
											2012-05-13 20:14:04 +03:00
										 |  |  | varies between systems; sometimes it is ``/usr/lib/sendmail``, sometimes
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | ``/usr/sbin/sendmail``.  The sendmail manual page will help you out.  Here's
 | 
					
						
							|  |  |  | some sample code::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    import os
 | 
					
						
							| 
									
										
										
										
											2016-05-10 12:01:23 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |    SENDMAIL = "/usr/sbin/sendmail"  # sendmail location
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  |    p = os.popen("%s -t -i" % SENDMAIL, "w")
 | 
					
						
							|  |  |  |    p.write("To: receiver@example.com\n")
 | 
					
						
							|  |  |  |    p.write("Subject: test\n")
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  |    p.write("\n")  # blank line separating headers from body
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  |    p.write("Some text\n")
 | 
					
						
							|  |  |  |    p.write("some more text\n")
 | 
					
						
							|  |  |  |    sts = p.close()
 | 
					
						
							|  |  |  |    if sts != 0:
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  |        print("Sendmail exit status", sts)
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | How do I avoid blocking in the connect() method of a socket?
 | 
					
						
							|  |  |  | ------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-05 11:24:15 +00:00
										 |  |  | The :mod:`select` module is commonly used to help with asynchronous I/O on
 | 
					
						
							|  |  |  | sockets.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | To prevent the TCP connect from blocking, you can set the socket to non-blocking
 | 
					
						
							|  |  |  | mode.  Then when you do the ``connect()``, you will either connect immediately
 | 
					
						
							|  |  |  | (unlikely) or get an exception that contains the error number as ``.errno``.
 | 
					
						
							|  |  |  | ``errno.EINPROGRESS`` indicates that the connection is in progress, but hasn't
 | 
					
						
							|  |  |  | finished yet.  Different OSes will return different values, so you're going to
 | 
					
						
							|  |  |  | have to check what's returned on your system.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | You can use the ``connect_ex()`` method to avoid creating an exception.  It will
 | 
					
						
							|  |  |  | just return the errno value.  To poll, you can call ``connect_ex()`` again later
 | 
					
						
							| 
									
										
										
										
											2009-12-19 17:57:51 +00:00
										 |  |  | -- ``0`` or ``errno.EISCONN`` indicate that you're connected -- or you can pass this
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | socket to select to check if it's writable.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-05 11:24:15 +00:00
										 |  |  | .. note::
 | 
					
						
							|  |  |  |    The :mod:`asyncore` module presents a framework-like approach to the problem
 | 
					
						
							|  |  |  |    of writing non-blocking networking code.
 | 
					
						
							| 
									
										
										
										
											2014-10-29 10:57:37 +01:00
										 |  |  |    The third-party `Twisted <https://twistedmatrix.com/trac/>`_ library is
 | 
					
						
							| 
									
										
										
										
											2011-02-05 11:24:15 +00:00
										 |  |  |    a popular and feature-rich alternative.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Databases
 | 
					
						
							|  |  |  | =========
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Are there any interfaces to database packages in Python?
 | 
					
						
							|  |  |  | --------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Yes.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-13 16:55:12 +00:00
										 |  |  | Interfaces to disk-based hashes such as :mod:`DBM <dbm.ndbm>` and :mod:`GDBM
 | 
					
						
							|  |  |  | <dbm.gnu>` are also included with standard Python.  There is also the
 | 
					
						
							|  |  |  | :mod:`sqlite3` module, which provides a lightweight disk-based relational
 | 
					
						
							|  |  |  | database.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Support for most relational databases is available.  See the
 | 
					
						
							|  |  |  | `DatabaseProgramming wiki page
 | 
					
						
							| 
									
										
										
										
											2014-10-29 08:36:35 +01:00
										 |  |  | <https://wiki.python.org/moin/DatabaseProgramming>`_ for details.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | How do you implement persistent objects in Python?
 | 
					
						
							|  |  |  | --------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The :mod:`pickle` library module solves this in a very general way (though you
 | 
					
						
							|  |  |  | still can't store things like open files, sockets or windows), and the
 | 
					
						
							|  |  |  | :mod:`shelve` library module uses pickle and (g)dbm to create persistent
 | 
					
						
							| 
									
										
										
										
											2009-10-13 16:55:12 +00:00
										 |  |  | mappings containing arbitrary Python objects.
 | 
					
						
							| 
									
										
										
										
											2009-10-11 21:25:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Mathematics and Numerics
 | 
					
						
							|  |  |  | ========================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | How do I generate random numbers in Python?
 | 
					
						
							|  |  |  | -------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The standard module :mod:`random` implements a random number generator.  Usage
 | 
					
						
							|  |  |  | is simple::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    import random
 | 
					
						
							|  |  |  |    random.random()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This returns a random floating point number in the range [0, 1).
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | There are also many other specialized generators in this module, such as:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * ``randrange(a, b)`` chooses an integer in the range [a, b).
 | 
					
						
							|  |  |  | * ``uniform(a, b)`` chooses a floating point number in the range [a, b).
 | 
					
						
							|  |  |  | * ``normalvariate(mean, sdev)`` samples the normal (Gaussian) distribution.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Some higher-level functions operate on sequences directly, such as:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * ``choice(S)`` chooses random element from a given sequence
 | 
					
						
							|  |  |  | * ``shuffle(L)`` shuffles a list in-place, i.e. permutes it randomly
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | There's also a ``Random`` class you can instantiate to create independent
 | 
					
						
							|  |  |  | multiple random number generators.
 |