mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Initial checkin of the 2.6 and 3.0 doc trees.
This commit is contained in:
197
Doc-26/ACKS
Normal file
197
Doc-26/ACKS
Normal file
@@ -0,0 +1,197 @@
|
||||
Contributors to the Python Documentation
|
||||
----------------------------------------
|
||||
|
||||
This file lists people who have contributed in some way to the Python
|
||||
documentation. It is probably not complete -- if you feel that you or
|
||||
anyone else should be on this list, please let us know (send email to
|
||||
docs@python.org), and we'll be glad to correct the problem.
|
||||
|
||||
It is only with the input and contributions of the Python community
|
||||
that Python has such wonderful documentation -- Thank You!
|
||||
|
||||
|
||||
* Aahz
|
||||
* Michael Abbott
|
||||
* Steve Alexander
|
||||
* Jim Ahlstrom
|
||||
* Fred Allen
|
||||
* A. Amoroso
|
||||
* Pehr Anderson
|
||||
* Oliver Andrich
|
||||
* Jesús Cea Avión
|
||||
* Daniel Barclay
|
||||
* Chris Barker
|
||||
* Don Bashford
|
||||
* Anthony Baxter
|
||||
* Bennett Benson
|
||||
* Jonathan Black
|
||||
* Robin Boerdijk
|
||||
* Michal Bozon
|
||||
* Aaron Brancotti
|
||||
* Keith Briggs
|
||||
* Lee Busby
|
||||
* Lorenzo M. Catucci
|
||||
* Mauro Cicognini
|
||||
* Gilles Civario
|
||||
* Mike Clarkson
|
||||
* Steve Clift
|
||||
* Dave Cole
|
||||
* Matthew Cowles
|
||||
* Jeremy Craven
|
||||
* Andrew Dalke
|
||||
* Ben Darnell
|
||||
* L. Peter Deutsch
|
||||
* Robert Donohue
|
||||
* Fred L. Drake, Jr.
|
||||
* Jeff Epler
|
||||
* Michael Ernst
|
||||
* Blame Andy Eskilsson
|
||||
* Carey Evans
|
||||
* Martijn Faassen
|
||||
* Carl Feynman
|
||||
* Hernán Martínez Foffani
|
||||
* Stefan Franke
|
||||
* Jim Fulton
|
||||
* Peter Funk
|
||||
* Lele Gaifax
|
||||
* Matthew Gallagher
|
||||
* Ben Gertzfield
|
||||
* Nadim Ghaznavi
|
||||
* Jonathan Giddy
|
||||
* Shelley Gooch
|
||||
* Nathaniel Gray
|
||||
* Grant Griffin
|
||||
* Thomas Guettler
|
||||
* Anders Hammarquist
|
||||
* Mark Hammond
|
||||
* Harald Hanche-Olsen
|
||||
* Manus Hand
|
||||
* Gerhard Häring
|
||||
* Travis B. Hartwell
|
||||
* Janko Hauser
|
||||
* Bernhard Herzog
|
||||
* Magnus L. Hetland
|
||||
* Konrad Hinsen
|
||||
* Stefan Hoffmeister
|
||||
* Albert Hofkamp
|
||||
* Gregor Hoffleit
|
||||
* Steve Holden
|
||||
* Thomas Holenstein
|
||||
* Gerrit Holl
|
||||
* Rob Hooft
|
||||
* Brian Hooper
|
||||
* Randall Hopper
|
||||
* Michael Hudson
|
||||
* Eric Huss
|
||||
* Jeremy Hylton
|
||||
* Roger Irwin
|
||||
* Jack Jansen
|
||||
* Philip H. Jensen
|
||||
* Pedro Diaz Jimenez
|
||||
* Kent Johnson
|
||||
* Lucas de Jonge
|
||||
* Andreas Jung
|
||||
* Robert Kern
|
||||
* Jim Kerr
|
||||
* Jan Kim
|
||||
* Greg Kochanski
|
||||
* Guido Kollerie
|
||||
* Peter A. Koren
|
||||
* Daniel Kozan
|
||||
* Andrew M. Kuchling
|
||||
* Dave Kuhlman
|
||||
* Erno Kuusela
|
||||
* Detlef Lannert
|
||||
* Piers Lauder
|
||||
* Glyph Lefkowitz
|
||||
* Marc-André Lemburg
|
||||
* Ulf A. Lindgren
|
||||
* Everett Lipman
|
||||
* Mirko Liss
|
||||
* Martin von Löwis
|
||||
* Fredrik Lundh
|
||||
* Jeff MacDonald
|
||||
* John Machin
|
||||
* Andrew MacIntyre
|
||||
* Vladimir Marangozov
|
||||
* Vincent Marchetti
|
||||
* Laura Matson
|
||||
* Daniel May
|
||||
* Doug Mennella
|
||||
* Paolo Milani
|
||||
* Skip Montanaro
|
||||
* Paul Moore
|
||||
* Ross Moore
|
||||
* Sjoerd Mullender
|
||||
* Dale Nagata
|
||||
* Ng Pheng Siong
|
||||
* Koray Oner
|
||||
* Tomas Oppelstrup
|
||||
* Denis S. Otkidach
|
||||
* Zooko O'Whielacronx
|
||||
* William Park
|
||||
* Joonas Paalasmaa
|
||||
* Harri Pasanen
|
||||
* Bo Peng
|
||||
* Tim Peters
|
||||
* Christopher Petrilli
|
||||
* Justin D. Pettit
|
||||
* Chris Phoenix
|
||||
* François Pinard
|
||||
* Paul Prescod
|
||||
* Eric S. Raymond
|
||||
* Edward K. Ream
|
||||
* Sean Reifschneider
|
||||
* Bernhard Reiter
|
||||
* Armin Rigo
|
||||
* Wes Rishel
|
||||
* Jim Roskind
|
||||
* Guido van Rossum
|
||||
* Donald Wallace Rouse II
|
||||
* Nick Russo
|
||||
* Chris Ryland
|
||||
* Constantina S.
|
||||
* Hugh Sasse
|
||||
* Bob Savage
|
||||
* Scott Schram
|
||||
* Neil Schemenauer
|
||||
* Barry Scott
|
||||
* Joakim Sernbrant
|
||||
* Justin Sheehy
|
||||
* Michael Simcich
|
||||
* Ionel Simionescu
|
||||
* Gregory P. Smith
|
||||
* Roy Smith
|
||||
* Clay Spence
|
||||
* Nicholas Spies
|
||||
* Tage Stabell-Kulo
|
||||
* Frank Stajano
|
||||
* Anthony Starks
|
||||
* Greg Stein
|
||||
* Peter Stoehr
|
||||
* Mark Summerfield
|
||||
* Reuben Sumner
|
||||
* Kalle Svensson
|
||||
* Jim Tittsler
|
||||
* Ville Vainio
|
||||
* Martijn Vries
|
||||
* Charles G. Waldman
|
||||
* Greg Ward
|
||||
* Barry Warsaw
|
||||
* Corran Webster
|
||||
* Glyn Webster
|
||||
* Bob Weiner
|
||||
* Eddy Welbourne
|
||||
* Mats Wichmann
|
||||
* Gerry Wiener
|
||||
* Timothy Wild
|
||||
* Collin Winter
|
||||
* Blake Winton
|
||||
* Dan Wolfe
|
||||
* Steven Work
|
||||
* Thomas Wouters
|
||||
* Ka-Ping Yee
|
||||
* Rory Yorke
|
||||
* Moshe Zadka
|
||||
* Milan Zamazal
|
||||
* Cheng Zhang
|
||||
18
Doc-26/TODO
Normal file
18
Doc-26/TODO
Normal file
@@ -0,0 +1,18 @@
|
||||
To do after conversion
|
||||
======================
|
||||
|
||||
* fix all references and links marked with `XXX`
|
||||
* adjust all literal include paths
|
||||
* remove all non-literal includes
|
||||
* fix all duplicate labels and undefined label references
|
||||
* fix the email package docs: add a toctree
|
||||
* split very large files and add toctrees
|
||||
* integrate standalone HOWTOs
|
||||
* find out which files get "comments disabled" metadata
|
||||
* double backslashes in production lists
|
||||
* add synopses for each module
|
||||
* write "About these documents"
|
||||
* finish "Documenting Python"
|
||||
* extend copyright.rst
|
||||
* fix the "quadruple" index term
|
||||
* fix :file: and |version| in install
|
||||
18
Doc-26/about.rst
Normal file
18
Doc-26/about.rst
Normal file
@@ -0,0 +1,18 @@
|
||||
=====================
|
||||
About these documents
|
||||
=====================
|
||||
|
||||
These documents are generated from `reStructuredText
|
||||
<http://docutils.sf.net/rst.html>`_ sources by *Sphinx*, a document processor
|
||||
specifically written for the Python documentation.
|
||||
|
||||
In the online version of these documents, you can submit comments and suggest
|
||||
changes directly on the documentation pages.
|
||||
|
||||
Development of the documentation and its toolchain takes place on the
|
||||
docs@python.org mailing list. We're always looking for volunteers wanting
|
||||
to help with the docs, so feel free to send a mail there!
|
||||
|
||||
See :ref:`reporting-bugs` for information how to report bugs in Python itself.
|
||||
|
||||
.. include:: ACKS
|
||||
58
Doc-26/bugs.rst
Normal file
58
Doc-26/bugs.rst
Normal file
@@ -0,0 +1,58 @@
|
||||
**************
|
||||
Reporting Bugs
|
||||
**************
|
||||
|
||||
.. _reporting-bugs:
|
||||
|
||||
Python is a mature programming language which has established a reputation for
|
||||
stability. In order to maintain this reputation, the developers would like to
|
||||
know of any deficiencies you find in Python or its documentation.
|
||||
|
||||
Before submitting a report, you will be required to log into SourceForge; this
|
||||
will make it possible for the developers to contact you for additional
|
||||
information if needed. It is not possible to submit a bug report anonymously.
|
||||
|
||||
All bug reports should be submitted via the Python Bug Tracker on SourceForge
|
||||
(http://sourceforge.net/bugs/?group_id=5470). The bug tracker offers a Web form
|
||||
which allows pertinent information to be entered and submitted to the
|
||||
developers.
|
||||
|
||||
The first step in filing a report is to determine whether the problem has
|
||||
already been reported. The advantage in doing so, aside from saving the
|
||||
developers time, is that you learn what has been done to fix it; it may be that
|
||||
the problem has already been fixed for the next release, or additional
|
||||
information is needed (in which case you are welcome to provide it if you can!).
|
||||
To do this, search the bug database using the search box on the left side of the
|
||||
page.
|
||||
|
||||
If the problem you're reporting is not already in the bug tracker, go back to
|
||||
the Python Bug Tracker (http://sourceforge.net/bugs/?group_id=5470). Select the
|
||||
"Submit a Bug" link at the top of the page to open the bug reporting form.
|
||||
|
||||
The submission form has a number of fields. The only fields that are required
|
||||
are the "Summary" and "Details" fields. For the summary, enter a *very* short
|
||||
description of the problem; less than ten words is good. In the Details field,
|
||||
describe the problem in detail, including what you expected to happen and what
|
||||
did happen. Be sure to include the version of Python you used, whether any
|
||||
extension modules were involved, and what hardware and software platform you
|
||||
were using (including version information as appropriate).
|
||||
|
||||
The only other field that you may want to set is the "Category" field, which
|
||||
allows you to place the bug report into a broad category (such as
|
||||
"Documentation" or "Library").
|
||||
|
||||
Each bug report will be assigned to a developer who will determine what needs to
|
||||
be done to correct the problem. You will receive an update each time action is
|
||||
taken on the bug.
|
||||
|
||||
|
||||
.. seealso::
|
||||
|
||||
`How to Report Bugs Effectively <http://www-mice.cs.ucl.ac.uk/multimedia/software/documentation/ReportingBugs.html>`_
|
||||
Article which goes into some detail about how to create a useful bug report.
|
||||
This describes what kind of information is useful and why it is useful.
|
||||
|
||||
`Bug Writing Guidelines <http://www.mozilla.org/quality/bug-writing-guidelines.html>`_
|
||||
Information about writing a good bug report. Some of this is specific to the
|
||||
Mozilla project, but describes general good practices.
|
||||
|
||||
1018
Doc-26/c-api/abstract.rst
Normal file
1018
Doc-26/c-api/abstract.rst
Normal file
File diff suppressed because it is too large
Load Diff
3556
Doc-26/c-api/concrete.rst
Normal file
3556
Doc-26/c-api/concrete.rst
Normal file
File diff suppressed because it is too large
Load Diff
534
Doc-26/c-api/exceptions.rst
Normal file
534
Doc-26/c-api/exceptions.rst
Normal file
@@ -0,0 +1,534 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
|
||||
.. _exceptionhandling:
|
||||
|
||||
******************
|
||||
Exception Handling
|
||||
******************
|
||||
|
||||
The functions described in this chapter will let you handle and raise Python
|
||||
exceptions. It is important to understand some of the basics of Python
|
||||
exception handling. It works somewhat like the Unix :cdata:`errno` variable:
|
||||
there is a global indicator (per thread) of the last error that occurred. Most
|
||||
functions don't clear this on success, but will set it to indicate the cause of
|
||||
the error on failure. Most functions also return an error indicator, usually
|
||||
*NULL* if they are supposed to return a pointer, or ``-1`` if they return an
|
||||
integer (exception: the :cfunc:`PyArg_\*` functions return ``1`` for success and
|
||||
``0`` for failure).
|
||||
|
||||
When a function must fail because some function it called failed, it generally
|
||||
doesn't set the error indicator; the function it called already set it. It is
|
||||
responsible for either handling the error and clearing the exception or
|
||||
returning after cleaning up any resources it holds (such as object references or
|
||||
memory allocations); it should *not* continue normally if it is not prepared to
|
||||
handle the error. If returning due to an error, it is important to indicate to
|
||||
the caller that an error has been set. If the error is not handled or carefully
|
||||
propagated, additional calls into the Python/C API may not behave as intended
|
||||
and may fail in mysterious ways.
|
||||
|
||||
.. index::
|
||||
single: exc_type (in module sys)
|
||||
single: exc_value (in module sys)
|
||||
single: exc_traceback (in module sys)
|
||||
|
||||
The error indicator consists of three Python objects corresponding to the
|
||||
Python variables ``sys.exc_type``, ``sys.exc_value`` and ``sys.exc_traceback``.
|
||||
API functions exist to interact with the error indicator in various ways. There
|
||||
is a separate error indicator for each thread.
|
||||
|
||||
.. % XXX Order of these should be more thoughtful.
|
||||
.. % Either alphabetical or some kind of structure.
|
||||
|
||||
|
||||
.. cfunction:: void PyErr_Print()
|
||||
|
||||
Print a standard traceback to ``sys.stderr`` and clear the error indicator.
|
||||
Call this function only when the error indicator is set. (Otherwise it will
|
||||
cause a fatal error!)
|
||||
|
||||
|
||||
.. cfunction:: PyObject* PyErr_Occurred()
|
||||
|
||||
Test whether the error indicator is set. If set, return the exception *type*
|
||||
(the first argument to the last call to one of the :cfunc:`PyErr_Set\*`
|
||||
functions or to :cfunc:`PyErr_Restore`). If not set, return *NULL*. You do not
|
||||
own a reference to the return value, so you do not need to :cfunc:`Py_DECREF`
|
||||
it.
|
||||
|
||||
.. note::
|
||||
|
||||
Do not compare the return value to a specific exception; use
|
||||
:cfunc:`PyErr_ExceptionMatches` instead, shown below. (The comparison could
|
||||
easily fail since the exception may be an instance instead of a class, in the
|
||||
case of a class exception, or it may the a subclass of the expected exception.)
|
||||
|
||||
|
||||
.. cfunction:: int PyErr_ExceptionMatches(PyObject *exc)
|
||||
|
||||
Equivalent to ``PyErr_GivenExceptionMatches(PyErr_Occurred(), exc)``. This
|
||||
should only be called when an exception is actually set; a memory access
|
||||
violation will occur if no exception has been raised.
|
||||
|
||||
|
||||
.. cfunction:: int PyErr_GivenExceptionMatches(PyObject *given, PyObject *exc)
|
||||
|
||||
Return true if the *given* exception matches the exception in *exc*. If *exc*
|
||||
is a class object, this also returns true when *given* is an instance of a
|
||||
subclass. If *exc* is a tuple, all exceptions in the tuple (and recursively in
|
||||
subtuples) are searched for a match. If *given* is *NULL*, a memory access
|
||||
violation will occur.
|
||||
|
||||
|
||||
.. cfunction:: void PyErr_NormalizeException(PyObject**exc, PyObject**val, PyObject**tb)
|
||||
|
||||
Under certain circumstances, the values returned by :cfunc:`PyErr_Fetch` below
|
||||
can be "unnormalized", meaning that ``*exc`` is a class object but ``*val`` is
|
||||
not an instance of the same class. This function can be used to instantiate
|
||||
the class in that case. If the values are already normalized, nothing happens.
|
||||
The delayed normalization is implemented to improve performance.
|
||||
|
||||
|
||||
.. cfunction:: void PyErr_Clear()
|
||||
|
||||
Clear the error indicator. If the error indicator is not set, there is no
|
||||
effect.
|
||||
|
||||
|
||||
.. cfunction:: void PyErr_Fetch(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)
|
||||
|
||||
Retrieve the error indicator into three variables whose addresses are passed.
|
||||
If the error indicator is not set, set all three variables to *NULL*. If it is
|
||||
set, it will be cleared and you own a reference to each object retrieved. The
|
||||
value and traceback object may be *NULL* even when the type object is not.
|
||||
|
||||
.. note::
|
||||
|
||||
This function is normally only used by code that needs to handle exceptions or
|
||||
by code that needs to save and restore the error indicator temporarily.
|
||||
|
||||
|
||||
.. cfunction:: void PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
|
||||
|
||||
Set the error indicator from the three objects. If the error indicator is
|
||||
already set, it is cleared first. If the objects are *NULL*, the error
|
||||
indicator is cleared. Do not pass a *NULL* type and non-*NULL* value or
|
||||
traceback. The exception type should be a class. Do not pass an invalid
|
||||
exception type or value. (Violating these rules will cause subtle problems
|
||||
later.) This call takes away a reference to each object: you must own a
|
||||
reference to each object before the call and after the call you no longer own
|
||||
these references. (If you don't understand this, don't use this function. I
|
||||
warned you.)
|
||||
|
||||
.. note::
|
||||
|
||||
This function is normally only used by code that needs to save and restore the
|
||||
error indicator temporarily; use :cfunc:`PyErr_Fetch` to save the current
|
||||
exception state.
|
||||
|
||||
|
||||
.. cfunction:: void PyErr_SetString(PyObject *type, const char *message)
|
||||
|
||||
This is the most common way to set the error indicator. The first argument
|
||||
specifies the exception type; it is normally one of the standard exceptions,
|
||||
e.g. :cdata:`PyExc_RuntimeError`. You need not increment its reference count.
|
||||
The second argument is an error message; it is converted to a string object.
|
||||
|
||||
|
||||
.. cfunction:: void PyErr_SetObject(PyObject *type, PyObject *value)
|
||||
|
||||
This function is similar to :cfunc:`PyErr_SetString` but lets you specify an
|
||||
arbitrary Python object for the "value" of the exception.
|
||||
|
||||
|
||||
.. cfunction:: PyObject* PyErr_Format(PyObject *exception, const char *format, ...)
|
||||
|
||||
This function sets the error indicator and returns *NULL*. *exception* should be
|
||||
a Python exception (class, not an instance). *format* should be a string,
|
||||
containing format codes, similar to :cfunc:`printf`. The ``width.precision``
|
||||
before a format code is parsed, but the width part is ignored.
|
||||
|
||||
.. % This should be exactly the same as the table in PyString_FromFormat.
|
||||
.. % One should just refer to the other.
|
||||
.. % The descriptions for %zd and %zu are wrong, but the truth is complicated
|
||||
.. % because not all compilers support the %z width modifier -- we fake it
|
||||
.. % when necessary via interpolating PY_FORMAT_SIZE_T.
|
||||
.. % %u, %lu, %zu should have "new in Python 2.5" blurbs.
|
||||
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| Format Characters | Type | Comment |
|
||||
+===================+===============+================================+
|
||||
| :attr:`%%` | *n/a* | The literal % character. |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| :attr:`%c` | int | A single character, |
|
||||
| | | represented as an C int. |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| :attr:`%d` | int | Exactly equivalent to |
|
||||
| | | ``printf("%d")``. |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| :attr:`%u` | unsigned int | Exactly equivalent to |
|
||||
| | | ``printf("%u")``. |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| :attr:`%ld` | long | Exactly equivalent to |
|
||||
| | | ``printf("%ld")``. |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| :attr:`%lu` | unsigned long | Exactly equivalent to |
|
||||
| | | ``printf("%lu")``. |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| :attr:`%zd` | Py_ssize_t | Exactly equivalent to |
|
||||
| | | ``printf("%zd")``. |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| :attr:`%zu` | size_t | Exactly equivalent to |
|
||||
| | | ``printf("%zu")``. |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| :attr:`%i` | int | Exactly equivalent to |
|
||||
| | | ``printf("%i")``. |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| :attr:`%x` | int | Exactly equivalent to |
|
||||
| | | ``printf("%x")``. |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| :attr:`%s` | char\* | A null-terminated C character |
|
||||
| | | array. |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| :attr:`%p` | void\* | The hex representation of a C |
|
||||
| | | pointer. Mostly equivalent to |
|
||||
| | | ``printf("%p")`` except that |
|
||||
| | | it is guaranteed to start with |
|
||||
| | | the literal ``0x`` regardless |
|
||||
| | | of what the platform's |
|
||||
| | | ``printf`` yields. |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
|
||||
An unrecognized format character causes all the rest of the format string to be
|
||||
copied as-is to the result string, and any extra arguments discarded.
|
||||
|
||||
|
||||
.. cfunction:: void PyErr_SetNone(PyObject *type)
|
||||
|
||||
This is a shorthand for ``PyErr_SetObject(type, Py_None)``.
|
||||
|
||||
|
||||
.. cfunction:: int PyErr_BadArgument()
|
||||
|
||||
This is a shorthand for ``PyErr_SetString(PyExc_TypeError, message)``, where
|
||||
*message* indicates that a built-in operation was invoked with an illegal
|
||||
argument. It is mostly for internal use.
|
||||
|
||||
|
||||
.. cfunction:: PyObject* PyErr_NoMemory()
|
||||
|
||||
This is a shorthand for ``PyErr_SetNone(PyExc_MemoryError)``; it returns *NULL*
|
||||
so an object allocation function can write ``return PyErr_NoMemory();`` when it
|
||||
runs out of memory.
|
||||
|
||||
|
||||
.. cfunction:: PyObject* PyErr_SetFromErrno(PyObject *type)
|
||||
|
||||
.. index:: single: strerror()
|
||||
|
||||
This is a convenience function to raise an exception when a C library function
|
||||
has returned an error and set the C variable :cdata:`errno`. It constructs a
|
||||
tuple object whose first item is the integer :cdata:`errno` value and whose
|
||||
second item is the corresponding error message (gotten from :cfunc:`strerror`),
|
||||
and then calls ``PyErr_SetObject(type, object)``. On Unix, when the
|
||||
:cdata:`errno` value is :const:`EINTR`, indicating an interrupted system call,
|
||||
this calls :cfunc:`PyErr_CheckSignals`, and if that set the error indicator,
|
||||
leaves it set to that. The function always returns *NULL*, so a wrapper
|
||||
function around a system call can write ``return PyErr_SetFromErrno(type);``
|
||||
when the system call returns an error.
|
||||
|
||||
|
||||
.. cfunction:: PyObject* PyErr_SetFromErrnoWithFilename(PyObject *type, const char *filename)
|
||||
|
||||
Similar to :cfunc:`PyErr_SetFromErrno`, with the additional behavior that if
|
||||
*filename* is not *NULL*, it is passed to the constructor of *type* as a third
|
||||
parameter. In the case of exceptions such as :exc:`IOError` and :exc:`OSError`,
|
||||
this is used to define the :attr:`filename` attribute of the exception instance.
|
||||
|
||||
|
||||
.. cfunction:: PyObject* PyErr_SetFromWindowsErr(int ierr)
|
||||
|
||||
This is a convenience function to raise :exc:`WindowsError`. If called with
|
||||
*ierr* of :cdata:`0`, the error code returned by a call to :cfunc:`GetLastError`
|
||||
is used instead. It calls the Win32 function :cfunc:`FormatMessage` to retrieve
|
||||
the Windows description of error code given by *ierr* or :cfunc:`GetLastError`,
|
||||
then it constructs a tuple object whose first item is the *ierr* value and whose
|
||||
second item is the corresponding error message (gotten from
|
||||
:cfunc:`FormatMessage`), and then calls ``PyErr_SetObject(PyExc_WindowsError,
|
||||
object)``. This function always returns *NULL*. Availability: Windows.
|
||||
|
||||
|
||||
.. cfunction:: PyObject* PyErr_SetExcFromWindowsErr(PyObject *type, int ierr)
|
||||
|
||||
Similar to :cfunc:`PyErr_SetFromWindowsErr`, with an additional parameter
|
||||
specifying the exception type to be raised. Availability: Windows.
|
||||
|
||||
.. versionadded:: 2.3
|
||||
|
||||
|
||||
.. cfunction:: PyObject* PyErr_SetFromWindowsErrWithFilename(int ierr, const char *filename)
|
||||
|
||||
Similar to :cfunc:`PyErr_SetFromWindowsErr`, with the additional behavior that
|
||||
if *filename* is not *NULL*, it is passed to the constructor of
|
||||
:exc:`WindowsError` as a third parameter. Availability: Windows.
|
||||
|
||||
|
||||
.. cfunction:: PyObject* PyErr_SetExcFromWindowsErrWithFilename(PyObject *type, int ierr, char *filename)
|
||||
|
||||
Similar to :cfunc:`PyErr_SetFromWindowsErrWithFilename`, with an additional
|
||||
parameter specifying the exception type to be raised. Availability: Windows.
|
||||
|
||||
.. versionadded:: 2.3
|
||||
|
||||
|
||||
.. cfunction:: void PyErr_BadInternalCall()
|
||||
|
||||
This is a shorthand for ``PyErr_SetString(PyExc_TypeError, message)``, where
|
||||
*message* indicates that an internal operation (e.g. a Python/C API function)
|
||||
was invoked with an illegal argument. It is mostly for internal use.
|
||||
|
||||
|
||||
.. cfunction:: int PyErr_WarnEx(PyObject *category, char *message, int stacklevel)
|
||||
|
||||
Issue a warning message. The *category* argument is a warning category (see
|
||||
below) or *NULL*; the *message* argument is a message string. *stacklevel* is a
|
||||
positive number giving a number of stack frames; the warning will be issued from
|
||||
the currently executing line of code in that stack frame. A *stacklevel* of 1
|
||||
is the function calling :cfunc:`PyErr_WarnEx`, 2 is the function above that,
|
||||
and so forth.
|
||||
|
||||
This function normally prints a warning message to *sys.stderr*; however, it is
|
||||
also possible that the user has specified that warnings are to be turned into
|
||||
errors, and in that case this will raise an exception. It is also possible that
|
||||
the function raises an exception because of a problem with the warning machinery
|
||||
(the implementation imports the :mod:`warnings` module to do the heavy lifting).
|
||||
The return value is ``0`` if no exception is raised, or ``-1`` if an exception
|
||||
is raised. (It is not possible to determine whether a warning message is
|
||||
actually printed, nor what the reason is for the exception; this is
|
||||
intentional.) If an exception is raised, the caller should do its normal
|
||||
exception handling (for example, :cfunc:`Py_DECREF` owned references and return
|
||||
an error value).
|
||||
|
||||
Warning categories must be subclasses of :cdata:`Warning`; the default warning
|
||||
category is :cdata:`RuntimeWarning`. The standard Python warning categories are
|
||||
available as global variables whose names are ``PyExc_`` followed by the Python
|
||||
exception name. These have the type :ctype:`PyObject\*`; they are all class
|
||||
objects. Their names are :cdata:`PyExc_Warning`, :cdata:`PyExc_UserWarning`,
|
||||
:cdata:`PyExc_UnicodeWarning`, :cdata:`PyExc_DeprecationWarning`,
|
||||
:cdata:`PyExc_SyntaxWarning`, :cdata:`PyExc_RuntimeWarning`, and
|
||||
:cdata:`PyExc_FutureWarning`. :cdata:`PyExc_Warning` is a subclass of
|
||||
:cdata:`PyExc_Exception`; the other warning categories are subclasses of
|
||||
:cdata:`PyExc_Warning`.
|
||||
|
||||
For information about warning control, see the documentation for the
|
||||
:mod:`warnings` module and the :option:`-W` option in the command line
|
||||
documentation. There is no C API for warning control.
|
||||
|
||||
|
||||
.. cfunction:: int PyErr_Warn(PyObject *category, char *message)
|
||||
|
||||
Issue a warning message. The *category* argument is a warning category (see
|
||||
below) or *NULL*; the *message* argument is a message string. The warning will
|
||||
appear to be issued from the function calling :cfunc:`PyErr_Warn`, equivalent to
|
||||
calling :cfunc:`PyErr_WarnEx` with a *stacklevel* of 1.
|
||||
|
||||
Deprecated; use :cfunc:`PyErr_WarnEx` instead.
|
||||
|
||||
|
||||
.. cfunction:: int PyErr_WarnExplicit(PyObject *category, const char *message, const char *filename, int lineno, const char *module, PyObject *registry)
|
||||
|
||||
Issue a warning message with explicit control over all warning attributes. This
|
||||
is a straightforward wrapper around the Python function
|
||||
:func:`warnings.warn_explicit`, see there for more information. The *module*
|
||||
and *registry* arguments may be set to *NULL* to get the default effect
|
||||
described there.
|
||||
|
||||
|
||||
.. cfunction:: int PyErr_CheckSignals()
|
||||
|
||||
.. index::
|
||||
module: signal
|
||||
single: SIGINT
|
||||
single: KeyboardInterrupt (built-in exception)
|
||||
|
||||
This function interacts with Python's signal handling. It checks whether a
|
||||
signal has been sent to the processes and if so, invokes the corresponding
|
||||
signal handler. If the :mod:`signal` module is supported, this can invoke a
|
||||
signal handler written in Python. In all cases, the default effect for
|
||||
:const:`SIGINT` is to raise the :exc:`KeyboardInterrupt` exception. If an
|
||||
exception is raised the error indicator is set and the function returns ``-1``;
|
||||
otherwise the function returns ``0``. The error indicator may or may not be
|
||||
cleared if it was previously set.
|
||||
|
||||
|
||||
.. cfunction:: void PyErr_SetInterrupt()
|
||||
|
||||
.. index::
|
||||
single: SIGINT
|
||||
single: KeyboardInterrupt (built-in exception)
|
||||
|
||||
This function simulates the effect of a :const:`SIGINT` signal arriving --- the
|
||||
next time :cfunc:`PyErr_CheckSignals` is called, :exc:`KeyboardInterrupt` will
|
||||
be raised. It may be called without holding the interpreter lock.
|
||||
|
||||
.. % XXX This was described as obsolete, but is used in
|
||||
.. % thread.interrupt_main() (used from IDLE), so it's still needed.
|
||||
|
||||
|
||||
.. cfunction:: PyObject* PyErr_NewException(char *name, PyObject *base, PyObject *dict)
|
||||
|
||||
This utility function creates and returns a new exception object. The *name*
|
||||
argument must be the name of the new exception, a C string of the form
|
||||
``module.class``. The *base* and *dict* arguments are normally *NULL*. This
|
||||
creates a class object derived from :exc:`Exception` (accessible in C as
|
||||
:cdata:`PyExc_Exception`).
|
||||
|
||||
The :attr:`__module__` attribute of the new class is set to the first part (up
|
||||
to the last dot) of the *name* argument, and the class name is set to the last
|
||||
part (after the last dot). The *base* argument can be used to specify alternate
|
||||
base classes; it can either be only one class or a tuple of classes. The *dict*
|
||||
argument can be used to specify a dictionary of class variables and methods.
|
||||
|
||||
|
||||
.. cfunction:: void PyErr_WriteUnraisable(PyObject *obj)
|
||||
|
||||
This utility function prints a warning message to ``sys.stderr`` when an
|
||||
exception has been set but it is impossible for the interpreter to actually
|
||||
raise the exception. It is used, for example, when an exception occurs in an
|
||||
:meth:`__del__` method.
|
||||
|
||||
The function is called with a single argument *obj* that identifies the context
|
||||
in which the unraisable exception occurred. The repr of *obj* will be printed in
|
||||
the warning message.
|
||||
|
||||
|
||||
.. _standardexceptions:
|
||||
|
||||
Standard Exceptions
|
||||
===================
|
||||
|
||||
All standard Python exceptions are available as global variables whose names are
|
||||
``PyExc_`` followed by the Python exception name. These have the type
|
||||
:ctype:`PyObject\*`; they are all class objects. For completeness, here are all
|
||||
the variables:
|
||||
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| C Name | Python Name | Notes |
|
||||
+====================================+============================+==========+
|
||||
| :cdata:`PyExc_BaseException` | :exc:`BaseException` | (1), (4) |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_Exception` | :exc:`Exception` | \(1) |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_StandardError` | :exc:`StandardError` | \(1) |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_ArithmeticError` | :exc:`ArithmeticError` | \(1) |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_LookupError` | :exc:`LookupError` | \(1) |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_AssertionError` | :exc:`AssertionError` | |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_AttributeError` | :exc:`AttributeError` | |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_EOFError` | :exc:`EOFError` | |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_EnvironmentError` | :exc:`EnvironmentError` | \(1) |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_FloatingPointError` | :exc:`FloatingPointError` | |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_IOError` | :exc:`IOError` | |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_ImportError` | :exc:`ImportError` | |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_IndexError` | :exc:`IndexError` | |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_KeyError` | :exc:`KeyError` | |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_KeyboardInterrupt` | :exc:`KeyboardInterrupt` | |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_MemoryError` | :exc:`MemoryError` | |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_NameError` | :exc:`NameError` | |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_NotImplementedError` | :exc:`NotImplementedError` | |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_OSError` | :exc:`OSError` | |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_OverflowError` | :exc:`OverflowError` | |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_ReferenceError` | :exc:`ReferenceError` | \(2) |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_RuntimeError` | :exc:`RuntimeError` | |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_SyntaxError` | :exc:`SyntaxError` | |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_SystemError` | :exc:`SystemError` | |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_SystemExit` | :exc:`SystemExit` | |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_TypeError` | :exc:`TypeError` | |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_ValueError` | :exc:`ValueError` | |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_WindowsError` | :exc:`WindowsError` | \(3) |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
| :cdata:`PyExc_ZeroDivisionError` | :exc:`ZeroDivisionError` | |
|
||||
+------------------------------------+----------------------------+----------+
|
||||
|
||||
.. index::
|
||||
single: PyExc_BaseException
|
||||
single: PyExc_Exception
|
||||
single: PyExc_StandardError
|
||||
single: PyExc_ArithmeticError
|
||||
single: PyExc_LookupError
|
||||
single: PyExc_AssertionError
|
||||
single: PyExc_AttributeError
|
||||
single: PyExc_EOFError
|
||||
single: PyExc_EnvironmentError
|
||||
single: PyExc_FloatingPointError
|
||||
single: PyExc_IOError
|
||||
single: PyExc_ImportError
|
||||
single: PyExc_IndexError
|
||||
single: PyExc_KeyError
|
||||
single: PyExc_KeyboardInterrupt
|
||||
single: PyExc_MemoryError
|
||||
single: PyExc_NameError
|
||||
single: PyExc_NotImplementedError
|
||||
single: PyExc_OSError
|
||||
single: PyExc_OverflowError
|
||||
single: PyExc_ReferenceError
|
||||
single: PyExc_RuntimeError
|
||||
single: PyExc_SyntaxError
|
||||
single: PyExc_SystemError
|
||||
single: PyExc_SystemExit
|
||||
single: PyExc_TypeError
|
||||
single: PyExc_ValueError
|
||||
single: PyExc_WindowsError
|
||||
single: PyExc_ZeroDivisionError
|
||||
|
||||
Notes:
|
||||
|
||||
(1)
|
||||
This is a base class for other standard exceptions.
|
||||
|
||||
(2)
|
||||
This is the same as :exc:`weakref.ReferenceError`.
|
||||
|
||||
(3)
|
||||
Only defined on Windows; protect code that uses this by testing that the
|
||||
preprocessor macro ``MS_WINDOWS`` is defined.
|
||||
|
||||
(4)
|
||||
.. versionadded:: 2.5
|
||||
|
||||
|
||||
Deprecation of String Exceptions
|
||||
================================
|
||||
|
||||
.. index:: single: BaseException (built-in exception)
|
||||
|
||||
All exceptions built into Python or provided in the standard library are derived
|
||||
from :exc:`BaseException`.
|
||||
|
||||
String exceptions are still supported in the interpreter to allow existing code
|
||||
to run unmodified, but this will also change in a future release.
|
||||
|
||||
33
Doc-26/c-api/index.rst
Normal file
33
Doc-26/c-api/index.rst
Normal file
@@ -0,0 +1,33 @@
|
||||
.. _c-api-index:
|
||||
|
||||
##################################
|
||||
Python/C API Reference Manual
|
||||
##################################
|
||||
|
||||
:Release: |version|
|
||||
:Date: |today|
|
||||
|
||||
This manual documents the API used by C and C++ programmers who want to write
|
||||
extension modules or embed Python. It is a companion to :ref:`extending-index`,
|
||||
which describes the general principles of extension writing but does not
|
||||
document the API functions in detail.
|
||||
|
||||
.. warning::
|
||||
|
||||
The current version of this document is somewhat incomplete. However, most of
|
||||
the important functions, types and structures are described.
|
||||
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
intro.rst
|
||||
veryhigh.rst
|
||||
refcounting.rst
|
||||
exceptions.rst
|
||||
utilities.rst
|
||||
abstract.rst
|
||||
concrete.rst
|
||||
init.rst
|
||||
memory.rst
|
||||
newtypes.rst
|
||||
935
Doc-26/c-api/init.rst
Normal file
935
Doc-26/c-api/init.rst
Normal file
@@ -0,0 +1,935 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
|
||||
.. _initialization:
|
||||
|
||||
*****************************************
|
||||
Initialization, Finalization, and Threads
|
||||
*****************************************
|
||||
|
||||
|
||||
.. cfunction:: void Py_Initialize()
|
||||
|
||||
.. index::
|
||||
single: Py_SetProgramName()
|
||||
single: PyEval_InitThreads()
|
||||
single: PyEval_ReleaseLock()
|
||||
single: PyEval_AcquireLock()
|
||||
single: modules (in module sys)
|
||||
single: path (in module sys)
|
||||
module: __builtin__
|
||||
module: __main__
|
||||
module: sys
|
||||
triple: module; search; path
|
||||
single: PySys_SetArgv()
|
||||
single: Py_Finalize()
|
||||
|
||||
Initialize the Python interpreter. In an application embedding Python, this
|
||||
should be called before using any other Python/C API functions; with the
|
||||
exception of :cfunc:`Py_SetProgramName`, :cfunc:`PyEval_InitThreads`,
|
||||
:cfunc:`PyEval_ReleaseLock`, and :cfunc:`PyEval_AcquireLock`. This initializes
|
||||
the table of loaded modules (``sys.modules``), and creates the fundamental
|
||||
modules :mod:`__builtin__`, :mod:`__main__` and :mod:`sys`. It also initializes
|
||||
the module search path (``sys.path``). It does not set ``sys.argv``; use
|
||||
:cfunc:`PySys_SetArgv` for that. This is a no-op when called for a second time
|
||||
(without calling :cfunc:`Py_Finalize` first). There is no return value; it is a
|
||||
fatal error if the initialization fails.
|
||||
|
||||
|
||||
.. cfunction:: void Py_InitializeEx(int initsigs)
|
||||
|
||||
This function works like :cfunc:`Py_Initialize` if *initsigs* is 1. If
|
||||
*initsigs* is 0, it skips initialization registration of signal handlers, which
|
||||
might be useful when Python is embedded.
|
||||
|
||||
.. versionadded:: 2.4
|
||||
|
||||
|
||||
.. cfunction:: int Py_IsInitialized()
|
||||
|
||||
Return true (nonzero) when the Python interpreter has been initialized, false
|
||||
(zero) if not. After :cfunc:`Py_Finalize` is called, this returns false until
|
||||
:cfunc:`Py_Initialize` is called again.
|
||||
|
||||
|
||||
.. cfunction:: void Py_Finalize()
|
||||
|
||||
Undo all initializations made by :cfunc:`Py_Initialize` and subsequent use of
|
||||
Python/C API functions, and destroy all sub-interpreters (see
|
||||
:cfunc:`Py_NewInterpreter` below) that were created and not yet destroyed since
|
||||
the last call to :cfunc:`Py_Initialize`. Ideally, this frees all memory
|
||||
allocated by the Python interpreter. This is a no-op when called for a second
|
||||
time (without calling :cfunc:`Py_Initialize` again first). There is no return
|
||||
value; errors during finalization are ignored.
|
||||
|
||||
This function is provided for a number of reasons. An embedding application
|
||||
might want to restart Python without having to restart the application itself.
|
||||
An application that has loaded the Python interpreter from a dynamically
|
||||
loadable library (or DLL) might want to free all memory allocated by Python
|
||||
before unloading the DLL. During a hunt for memory leaks in an application a
|
||||
developer might want to free all memory allocated by Python before exiting from
|
||||
the application.
|
||||
|
||||
**Bugs and caveats:** The destruction of modules and objects in modules is done
|
||||
in random order; this may cause destructors (:meth:`__del__` methods) to fail
|
||||
when they depend on other objects (even functions) or modules. Dynamically
|
||||
loaded extension modules loaded by Python are not unloaded. Small amounts of
|
||||
memory allocated by the Python interpreter may not be freed (if you find a leak,
|
||||
please report it). Memory tied up in circular references between objects is not
|
||||
freed. Some memory allocated by extension modules may not be freed. Some
|
||||
extensions may not work properly if their initialization routine is called more
|
||||
than once; this can happen if an application calls :cfunc:`Py_Initialize` and
|
||||
:cfunc:`Py_Finalize` more than once.
|
||||
|
||||
|
||||
.. cfunction:: PyThreadState* Py_NewInterpreter()
|
||||
|
||||
.. index::
|
||||
module: __builtin__
|
||||
module: __main__
|
||||
module: sys
|
||||
single: stdout (in module sys)
|
||||
single: stderr (in module sys)
|
||||
single: stdin (in module sys)
|
||||
|
||||
Create a new sub-interpreter. This is an (almost) totally separate environment
|
||||
for the execution of Python code. In particular, the new interpreter has
|
||||
separate, independent versions of all imported modules, including the
|
||||
fundamental modules :mod:`__builtin__`, :mod:`__main__` and :mod:`sys`. The
|
||||
table of loaded modules (``sys.modules``) and the module search path
|
||||
(``sys.path``) are also separate. The new environment has no ``sys.argv``
|
||||
variable. It has new standard I/O stream file objects ``sys.stdin``,
|
||||
``sys.stdout`` and ``sys.stderr`` (however these refer to the same underlying
|
||||
:ctype:`FILE` structures in the C library).
|
||||
|
||||
The return value points to the first thread state created in the new sub-
|
||||
interpreter. This thread state is made in the current thread state. Note that
|
||||
no actual thread is created; see the discussion of thread states below. If
|
||||
creation of the new interpreter is unsuccessful, *NULL* is returned; no
|
||||
exception is set since the exception state is stored in the current thread state
|
||||
and there may not be a current thread state. (Like all other Python/C API
|
||||
functions, the global interpreter lock must be held before calling this function
|
||||
and is still held when it returns; however, unlike most other Python/C API
|
||||
functions, there needn't be a current thread state on entry.)
|
||||
|
||||
.. index::
|
||||
single: Py_Finalize()
|
||||
single: Py_Initialize()
|
||||
|
||||
Extension modules are shared between (sub-)interpreters as follows: the first
|
||||
time a particular extension is imported, it is initialized normally, and a
|
||||
(shallow) copy of its module's dictionary is squirreled away. When the same
|
||||
extension is imported by another (sub-)interpreter, a new module is initialized
|
||||
and filled with the contents of this copy; the extension's ``init`` function is
|
||||
not called. Note that this is different from what happens when an extension is
|
||||
imported after the interpreter has been completely re-initialized by calling
|
||||
:cfunc:`Py_Finalize` and :cfunc:`Py_Initialize`; in that case, the extension's
|
||||
``initmodule`` function *is* called again.
|
||||
|
||||
.. index:: single: close() (in module os)
|
||||
|
||||
**Bugs and caveats:** Because sub-interpreters (and the main interpreter) are
|
||||
part of the same process, the insulation between them isn't perfect --- for
|
||||
example, using low-level file operations like :func:`os.close` they can
|
||||
(accidentally or maliciously) affect each other's open files. Because of the
|
||||
way extensions are shared between (sub-)interpreters, some extensions may not
|
||||
work properly; this is especially likely when the extension makes use of
|
||||
(static) global variables, or when the extension manipulates its module's
|
||||
dictionary after its initialization. It is possible to insert objects created
|
||||
in one sub-interpreter into a namespace of another sub-interpreter; this should
|
||||
be done with great care to avoid sharing user-defined functions, methods,
|
||||
instances or classes between sub-interpreters, since import operations executed
|
||||
by such objects may affect the wrong (sub-)interpreter's dictionary of loaded
|
||||
modules. (XXX This is a hard-to-fix bug that will be addressed in a future
|
||||
release.)
|
||||
|
||||
Also note that the use of this functionality is incompatible with extension
|
||||
modules such as PyObjC and ctypes that use the :cfunc:`PyGILState_\*` APIs (and
|
||||
this is inherent in the way the :cfunc:`PyGILState_\*` functions work). Simple
|
||||
things may work, but confusing behavior will always be near.
|
||||
|
||||
|
||||
.. cfunction:: void Py_EndInterpreter(PyThreadState *tstate)
|
||||
|
||||
.. index:: single: Py_Finalize()
|
||||
|
||||
Destroy the (sub-)interpreter represented by the given thread state. The given
|
||||
thread state must be the current thread state. See the discussion of thread
|
||||
states below. When the call returns, the current thread state is *NULL*. All
|
||||
thread states associated with this interpreter are destroyed. (The global
|
||||
interpreter lock must be held before calling this function and is still held
|
||||
when it returns.) :cfunc:`Py_Finalize` will destroy all sub-interpreters that
|
||||
haven't been explicitly destroyed at that point.
|
||||
|
||||
|
||||
.. cfunction:: void Py_SetProgramName(char *name)
|
||||
|
||||
.. index::
|
||||
single: Py_Initialize()
|
||||
single: main()
|
||||
single: Py_GetPath()
|
||||
|
||||
This function should be called before :cfunc:`Py_Initialize` is called for the
|
||||
first time, if it is called at all. It tells the interpreter the value of the
|
||||
``argv[0]`` argument to the :cfunc:`main` function of the program. This is used
|
||||
by :cfunc:`Py_GetPath` and some other functions below to find the Python run-
|
||||
time libraries relative to the interpreter executable. The default value is
|
||||
``'python'``. The argument should point to a zero-terminated character string
|
||||
in static storage whose contents will not change for the duration of the
|
||||
program's execution. No code in the Python interpreter will change the contents
|
||||
of this storage.
|
||||
|
||||
|
||||
.. cfunction:: char* Py_GetProgramName()
|
||||
|
||||
.. index:: single: Py_SetProgramName()
|
||||
|
||||
Return the program name set with :cfunc:`Py_SetProgramName`, or the default.
|
||||
The returned string points into static storage; the caller should not modify its
|
||||
value.
|
||||
|
||||
|
||||
.. cfunction:: char* Py_GetPrefix()
|
||||
|
||||
Return the *prefix* for installed platform-independent files. This is derived
|
||||
through a number of complicated rules from the program name set with
|
||||
:cfunc:`Py_SetProgramName` and some environment variables; for example, if the
|
||||
program name is ``'/usr/local/bin/python'``, the prefix is ``'/usr/local'``. The
|
||||
returned string points into static storage; the caller should not modify its
|
||||
value. This corresponds to the :makevar:`prefix` variable in the top-level
|
||||
:file:`Makefile` and the :option:`--prefix` argument to the :program:`configure`
|
||||
script at build time. The value is available to Python code as ``sys.prefix``.
|
||||
It is only useful on Unix. See also the next function.
|
||||
|
||||
|
||||
.. cfunction:: char* Py_GetExecPrefix()
|
||||
|
||||
Return the *exec-prefix* for installed platform-*de*pendent files. This is
|
||||
derived through a number of complicated rules from the program name set with
|
||||
:cfunc:`Py_SetProgramName` and some environment variables; for example, if the
|
||||
program name is ``'/usr/local/bin/python'``, the exec-prefix is
|
||||
``'/usr/local'``. The returned string points into static storage; the caller
|
||||
should not modify its value. This corresponds to the :makevar:`exec_prefix`
|
||||
variable in the top-level :file:`Makefile` and the :option:`--exec-prefix`
|
||||
argument to the :program:`configure` script at build time. The value is
|
||||
available to Python code as ``sys.exec_prefix``. It is only useful on Unix.
|
||||
|
||||
Background: The exec-prefix differs from the prefix when platform dependent
|
||||
files (such as executables and shared libraries) are installed in a different
|
||||
directory tree. In a typical installation, platform dependent files may be
|
||||
installed in the :file:`/usr/local/plat` subtree while platform independent may
|
||||
be installed in :file:`/usr/local`.
|
||||
|
||||
Generally speaking, a platform is a combination of hardware and software
|
||||
families, e.g. Sparc machines running the Solaris 2.x operating system are
|
||||
considered the same platform, but Intel machines running Solaris 2.x are another
|
||||
platform, and Intel machines running Linux are yet another platform. Different
|
||||
major revisions of the same operating system generally also form different
|
||||
platforms. Non-Unix operating systems are a different story; the installation
|
||||
strategies on those systems are so different that the prefix and exec-prefix are
|
||||
meaningless, and set to the empty string. Note that compiled Python bytecode
|
||||
files are platform independent (but not independent from the Python version by
|
||||
which they were compiled!).
|
||||
|
||||
System administrators will know how to configure the :program:`mount` or
|
||||
:program:`automount` programs to share :file:`/usr/local` between platforms
|
||||
while having :file:`/usr/local/plat` be a different filesystem for each
|
||||
platform.
|
||||
|
||||
|
||||
.. cfunction:: char* Py_GetProgramFullPath()
|
||||
|
||||
.. index::
|
||||
single: Py_SetProgramName()
|
||||
single: executable (in module sys)
|
||||
|
||||
Return the full program name of the Python executable; this is computed as a
|
||||
side-effect of deriving the default module search path from the program name
|
||||
(set by :cfunc:`Py_SetProgramName` above). The returned string points into
|
||||
static storage; the caller should not modify its value. The value is available
|
||||
to Python code as ``sys.executable``.
|
||||
|
||||
|
||||
.. cfunction:: char* Py_GetPath()
|
||||
|
||||
.. index::
|
||||
triple: module; search; path
|
||||
single: path (in module sys)
|
||||
|
||||
Return the default module search path; this is computed from the program name
|
||||
(set by :cfunc:`Py_SetProgramName` above) and some environment variables. The
|
||||
returned string consists of a series of directory names separated by a platform
|
||||
dependent delimiter character. The delimiter character is ``':'`` on Unix and
|
||||
Mac OS X, ``';'`` on Windows. The returned string points into static storage;
|
||||
the caller should not modify its value. The value is available to Python code
|
||||
as the list ``sys.path``, which may be modified to change the future search path
|
||||
for loaded modules.
|
||||
|
||||
.. % XXX should give the exact rules
|
||||
|
||||
|
||||
.. cfunction:: const char* Py_GetVersion()
|
||||
|
||||
Return the version of this Python interpreter. This is a string that looks
|
||||
something like ::
|
||||
|
||||
"1.5 (#67, Dec 31 1997, 22:34:28) [GCC 2.7.2.2]"
|
||||
|
||||
.. index:: single: version (in module sys)
|
||||
|
||||
The first word (up to the first space character) is the current Python version;
|
||||
the first three characters are the major and minor version separated by a
|
||||
period. The returned string points into static storage; the caller should not
|
||||
modify its value. The value is available to Python code as ``sys.version``.
|
||||
|
||||
|
||||
.. cfunction:: const char* Py_GetBuildNumber()
|
||||
|
||||
Return a string representing the Subversion revision that this Python executable
|
||||
was built from. This number is a string because it may contain a trailing 'M'
|
||||
if Python was built from a mixed revision source tree.
|
||||
|
||||
.. versionadded:: 2.5
|
||||
|
||||
|
||||
.. cfunction:: const char* Py_GetPlatform()
|
||||
|
||||
.. index:: single: platform (in module sys)
|
||||
|
||||
Return the platform identifier for the current platform. On Unix, this is
|
||||
formed from the "official" name of the operating system, converted to lower
|
||||
case, followed by the major revision number; e.g., for Solaris 2.x, which is
|
||||
also known as SunOS 5.x, the value is ``'sunos5'``. On Mac OS X, it is
|
||||
``'darwin'``. On Windows, it is ``'win'``. The returned string points into
|
||||
static storage; the caller should not modify its value. The value is available
|
||||
to Python code as ``sys.platform``.
|
||||
|
||||
|
||||
.. cfunction:: const char* Py_GetCopyright()
|
||||
|
||||
Return the official copyright string for the current Python version, for example
|
||||
|
||||
``'Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam'``
|
||||
|
||||
.. index:: single: copyright (in module sys)
|
||||
|
||||
The returned string points into static storage; the caller should not modify its
|
||||
value. The value is available to Python code as ``sys.copyright``.
|
||||
|
||||
|
||||
.. cfunction:: const char* Py_GetCompiler()
|
||||
|
||||
Return an indication of the compiler used to build the current Python version,
|
||||
in square brackets, for example::
|
||||
|
||||
"[GCC 2.7.2.2]"
|
||||
|
||||
.. index:: single: version (in module sys)
|
||||
|
||||
The returned string points into static storage; the caller should not modify its
|
||||
value. The value is available to Python code as part of the variable
|
||||
``sys.version``.
|
||||
|
||||
|
||||
.. cfunction:: const char* Py_GetBuildInfo()
|
||||
|
||||
Return information about the sequence number and build date and time of the
|
||||
current Python interpreter instance, for example ::
|
||||
|
||||
"#67, Aug 1 1997, 22:34:28"
|
||||
|
||||
.. index:: single: version (in module sys)
|
||||
|
||||
The returned string points into static storage; the caller should not modify its
|
||||
value. The value is available to Python code as part of the variable
|
||||
``sys.version``.
|
||||
|
||||
|
||||
.. cfunction:: void PySys_SetArgv(int argc, char **argv)
|
||||
|
||||
.. index::
|
||||
single: main()
|
||||
single: Py_FatalError()
|
||||
single: argv (in module sys)
|
||||
|
||||
Set ``sys.argv`` based on *argc* and *argv*. These parameters are similar to
|
||||
those passed to the program's :cfunc:`main` function with the difference that
|
||||
the first entry should refer to the script file to be executed rather than the
|
||||
executable hosting the Python interpreter. If there isn't a script that will be
|
||||
run, the first entry in *argv* can be an empty string. If this function fails
|
||||
to initialize ``sys.argv``, a fatal condition is signalled using
|
||||
:cfunc:`Py_FatalError`.
|
||||
|
||||
.. % XXX impl. doesn't seem consistent in allowing 0/NULL for the params;
|
||||
.. % check w/ Guido.
|
||||
|
||||
.. % XXX Other PySys thingies (doesn't really belong in this chapter)
|
||||
|
||||
|
||||
.. _threads:
|
||||
|
||||
Thread State and the Global Interpreter Lock
|
||||
============================================
|
||||
|
||||
.. index::
|
||||
single: global interpreter lock
|
||||
single: interpreter lock
|
||||
single: lock, interpreter
|
||||
|
||||
The Python interpreter is not fully thread safe. In order to support multi-
|
||||
threaded Python programs, there's a global lock that must be held by the current
|
||||
thread before it can safely access Python objects. Without the lock, even the
|
||||
simplest operations could cause problems in a multi-threaded program: for
|
||||
example, when two threads simultaneously increment the reference count of the
|
||||
same object, the reference count could end up being incremented only once
|
||||
instead of twice.
|
||||
|
||||
.. index:: single: setcheckinterval() (in module sys)
|
||||
|
||||
Therefore, the rule exists that only the thread that has acquired the global
|
||||
interpreter lock may operate on Python objects or call Python/C API functions.
|
||||
In order to support multi-threaded Python programs, the interpreter regularly
|
||||
releases and reacquires the lock --- by default, every 100 bytecode instructions
|
||||
(this can be changed with :func:`sys.setcheckinterval`). The lock is also
|
||||
released and reacquired around potentially blocking I/O operations like reading
|
||||
or writing a file, so that other threads can run while the thread that requests
|
||||
the I/O is waiting for the I/O operation to complete.
|
||||
|
||||
.. index::
|
||||
single: PyThreadState
|
||||
single: PyThreadState
|
||||
|
||||
The Python interpreter needs to keep some bookkeeping information separate per
|
||||
thread --- for this it uses a data structure called :ctype:`PyThreadState`.
|
||||
There's one global variable, however: the pointer to the current
|
||||
:ctype:`PyThreadState` structure. While most thread packages have a way to
|
||||
store "per-thread global data," Python's internal platform independent thread
|
||||
abstraction doesn't support this yet. Therefore, the current thread state must
|
||||
be manipulated explicitly.
|
||||
|
||||
This is easy enough in most cases. Most code manipulating the global
|
||||
interpreter lock has the following simple structure::
|
||||
|
||||
Save the thread state in a local variable.
|
||||
Release the interpreter lock.
|
||||
...Do some blocking I/O operation...
|
||||
Reacquire the interpreter lock.
|
||||
Restore the thread state from the local variable.
|
||||
|
||||
This is so common that a pair of macros exists to simplify it::
|
||||
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
...Do some blocking I/O operation...
|
||||
Py_END_ALLOW_THREADS
|
||||
|
||||
.. index::
|
||||
single: Py_BEGIN_ALLOW_THREADS
|
||||
single: Py_END_ALLOW_THREADS
|
||||
|
||||
The :cmacro:`Py_BEGIN_ALLOW_THREADS` macro opens a new block and declares a
|
||||
hidden local variable; the :cmacro:`Py_END_ALLOW_THREADS` macro closes the
|
||||
block. Another advantage of using these two macros is that when Python is
|
||||
compiled without thread support, they are defined empty, thus saving the thread
|
||||
state and lock manipulations.
|
||||
|
||||
When thread support is enabled, the block above expands to the following code::
|
||||
|
||||
PyThreadState *_save;
|
||||
|
||||
_save = PyEval_SaveThread();
|
||||
...Do some blocking I/O operation...
|
||||
PyEval_RestoreThread(_save);
|
||||
|
||||
Using even lower level primitives, we can get roughly the same effect as
|
||||
follows::
|
||||
|
||||
PyThreadState *_save;
|
||||
|
||||
_save = PyThreadState_Swap(NULL);
|
||||
PyEval_ReleaseLock();
|
||||
...Do some blocking I/O operation...
|
||||
PyEval_AcquireLock();
|
||||
PyThreadState_Swap(_save);
|
||||
|
||||
.. index::
|
||||
single: PyEval_RestoreThread()
|
||||
single: errno
|
||||
single: PyEval_SaveThread()
|
||||
single: PyEval_ReleaseLock()
|
||||
single: PyEval_AcquireLock()
|
||||
|
||||
There are some subtle differences; in particular, :cfunc:`PyEval_RestoreThread`
|
||||
saves and restores the value of the global variable :cdata:`errno`, since the
|
||||
lock manipulation does not guarantee that :cdata:`errno` is left alone. Also,
|
||||
when thread support is disabled, :cfunc:`PyEval_SaveThread` and
|
||||
:cfunc:`PyEval_RestoreThread` don't manipulate the lock; in this case,
|
||||
:cfunc:`PyEval_ReleaseLock` and :cfunc:`PyEval_AcquireLock` are not available.
|
||||
This is done so that dynamically loaded extensions compiled with thread support
|
||||
enabled can be loaded by an interpreter that was compiled with disabled thread
|
||||
support.
|
||||
|
||||
The global interpreter lock is used to protect the pointer to the current thread
|
||||
state. When releasing the lock and saving the thread state, the current thread
|
||||
state pointer must be retrieved before the lock is released (since another
|
||||
thread could immediately acquire the lock and store its own thread state in the
|
||||
global variable). Conversely, when acquiring the lock and restoring the thread
|
||||
state, the lock must be acquired before storing the thread state pointer.
|
||||
|
||||
Why am I going on with so much detail about this? Because when threads are
|
||||
created from C, they don't have the global interpreter lock, nor is there a
|
||||
thread state data structure for them. Such threads must bootstrap themselves
|
||||
into existence, by first creating a thread state data structure, then acquiring
|
||||
the lock, and finally storing their thread state pointer, before they can start
|
||||
using the Python/C API. When they are done, they should reset the thread state
|
||||
pointer, release the lock, and finally free their thread state data structure.
|
||||
|
||||
Beginning with version 2.3, threads can now take advantage of the
|
||||
:cfunc:`PyGILState_\*` functions to do all of the above automatically. The
|
||||
typical idiom for calling into Python from a C thread is now::
|
||||
|
||||
PyGILState_STATE gstate;
|
||||
gstate = PyGILState_Ensure();
|
||||
|
||||
/* Perform Python actions here. */
|
||||
result = CallSomeFunction();
|
||||
/* evaluate result */
|
||||
|
||||
/* Release the thread. No Python API allowed beyond this point. */
|
||||
PyGILState_Release(gstate);
|
||||
|
||||
Note that the :cfunc:`PyGILState_\*` functions assume there is only one global
|
||||
interpreter (created automatically by :cfunc:`Py_Initialize`). Python still
|
||||
supports the creation of additional interpreters (using
|
||||
:cfunc:`Py_NewInterpreter`), but mixing multiple interpreters and the
|
||||
:cfunc:`PyGILState_\*` API is unsupported.
|
||||
|
||||
|
||||
.. ctype:: PyInterpreterState
|
||||
|
||||
This data structure represents the state shared by a number of cooperating
|
||||
threads. Threads belonging to the same interpreter share their module
|
||||
administration and a few other internal items. There are no public members in
|
||||
this structure.
|
||||
|
||||
Threads belonging to different interpreters initially share nothing, except
|
||||
process state like available memory, open file descriptors and such. The global
|
||||
interpreter lock is also shared by all threads, regardless of to which
|
||||
interpreter they belong.
|
||||
|
||||
|
||||
.. ctype:: PyThreadState
|
||||
|
||||
This data structure represents the state of a single thread. The only public
|
||||
data member is :ctype:`PyInterpreterState \*`:attr:`interp`, which points to
|
||||
this thread's interpreter state.
|
||||
|
||||
|
||||
.. cfunction:: void PyEval_InitThreads()
|
||||
|
||||
.. index::
|
||||
single: PyEval_ReleaseLock()
|
||||
single: PyEval_ReleaseThread()
|
||||
single: PyEval_SaveThread()
|
||||
single: PyEval_RestoreThread()
|
||||
|
||||
Initialize and acquire the global interpreter lock. It should be called in the
|
||||
main thread before creating a second thread or engaging in any other thread
|
||||
operations such as :cfunc:`PyEval_ReleaseLock` or
|
||||
``PyEval_ReleaseThread(tstate)``. It is not needed before calling
|
||||
:cfunc:`PyEval_SaveThread` or :cfunc:`PyEval_RestoreThread`.
|
||||
|
||||
.. index:: single: Py_Initialize()
|
||||
|
||||
This is a no-op when called for a second time. It is safe to call this function
|
||||
before calling :cfunc:`Py_Initialize`.
|
||||
|
||||
.. index:: module: thread
|
||||
|
||||
When only the main thread exists, no lock operations are needed. This is a
|
||||
common situation (most Python programs do not use threads), and the lock
|
||||
operations slow the interpreter down a bit. Therefore, the lock is not created
|
||||
initially. This situation is equivalent to having acquired the lock: when
|
||||
there is only a single thread, all object accesses are safe. Therefore, when
|
||||
this function initializes the lock, it also acquires it. Before the Python
|
||||
:mod:`thread` module creates a new thread, knowing that either it has the lock
|
||||
or the lock hasn't been created yet, it calls :cfunc:`PyEval_InitThreads`. When
|
||||
this call returns, it is guaranteed that the lock has been created and that the
|
||||
calling thread has acquired it.
|
||||
|
||||
It is **not** safe to call this function when it is unknown which thread (if
|
||||
any) currently has the global interpreter lock.
|
||||
|
||||
This function is not available when thread support is disabled at compile time.
|
||||
|
||||
|
||||
.. cfunction:: int PyEval_ThreadsInitialized()
|
||||
|
||||
Returns a non-zero value if :cfunc:`PyEval_InitThreads` has been called. This
|
||||
function can be called without holding the lock, and therefore can be used to
|
||||
avoid calls to the locking API when running single-threaded. This function is
|
||||
not available when thread support is disabled at compile time.
|
||||
|
||||
.. versionadded:: 2.4
|
||||
|
||||
|
||||
.. cfunction:: void PyEval_AcquireLock()
|
||||
|
||||
Acquire the global interpreter lock. The lock must have been created earlier.
|
||||
If this thread already has the lock, a deadlock ensues. This function is not
|
||||
available when thread support is disabled at compile time.
|
||||
|
||||
|
||||
.. cfunction:: void PyEval_ReleaseLock()
|
||||
|
||||
Release the global interpreter lock. The lock must have been created earlier.
|
||||
This function is not available when thread support is disabled at compile time.
|
||||
|
||||
|
||||
.. cfunction:: void PyEval_AcquireThread(PyThreadState *tstate)
|
||||
|
||||
Acquire the global interpreter lock and set the current thread state to
|
||||
*tstate*, which should not be *NULL*. The lock must have been created earlier.
|
||||
If this thread already has the lock, deadlock ensues. This function is not
|
||||
available when thread support is disabled at compile time.
|
||||
|
||||
|
||||
.. cfunction:: void PyEval_ReleaseThread(PyThreadState *tstate)
|
||||
|
||||
Reset the current thread state to *NULL* and release the global interpreter
|
||||
lock. The lock must have been created earlier and must be held by the current
|
||||
thread. The *tstate* argument, which must not be *NULL*, is only used to check
|
||||
that it represents the current thread state --- if it isn't, a fatal error is
|
||||
reported. This function is not available when thread support is disabled at
|
||||
compile time.
|
||||
|
||||
|
||||
.. cfunction:: PyThreadState* PyEval_SaveThread()
|
||||
|
||||
Release the interpreter lock (if it has been created and thread support is
|
||||
enabled) and reset the thread state to *NULL*, returning the previous thread
|
||||
state (which is not *NULL*). If the lock has been created, the current thread
|
||||
must have acquired it. (This function is available even when thread support is
|
||||
disabled at compile time.)
|
||||
|
||||
|
||||
.. cfunction:: void PyEval_RestoreThread(PyThreadState *tstate)
|
||||
|
||||
Acquire the interpreter lock (if it has been created and thread support is
|
||||
enabled) and set the thread state to *tstate*, which must not be *NULL*. If the
|
||||
lock has been created, the current thread must not have acquired it, otherwise
|
||||
deadlock ensues. (This function is available even when thread support is
|
||||
disabled at compile time.)
|
||||
|
||||
The following macros are normally used without a trailing semicolon; look for
|
||||
example usage in the Python source distribution.
|
||||
|
||||
|
||||
.. cmacro:: Py_BEGIN_ALLOW_THREADS
|
||||
|
||||
This macro expands to ``{ PyThreadState *_save; _save = PyEval_SaveThread();``.
|
||||
Note that it contains an opening brace; it must be matched with a following
|
||||
:cmacro:`Py_END_ALLOW_THREADS` macro. See above for further discussion of this
|
||||
macro. It is a no-op when thread support is disabled at compile time.
|
||||
|
||||
|
||||
.. cmacro:: Py_END_ALLOW_THREADS
|
||||
|
||||
This macro expands to ``PyEval_RestoreThread(_save); }``. Note that it contains
|
||||
a closing brace; it must be matched with an earlier
|
||||
:cmacro:`Py_BEGIN_ALLOW_THREADS` macro. See above for further discussion of
|
||||
this macro. It is a no-op when thread support is disabled at compile time.
|
||||
|
||||
|
||||
.. cmacro:: Py_BLOCK_THREADS
|
||||
|
||||
This macro expands to ``PyEval_RestoreThread(_save);``: it is equivalent to
|
||||
:cmacro:`Py_END_ALLOW_THREADS` without the closing brace. It is a no-op when
|
||||
thread support is disabled at compile time.
|
||||
|
||||
|
||||
.. cmacro:: Py_UNBLOCK_THREADS
|
||||
|
||||
This macro expands to ``_save = PyEval_SaveThread();``: it is equivalent to
|
||||
:cmacro:`Py_BEGIN_ALLOW_THREADS` without the opening brace and variable
|
||||
declaration. It is a no-op when thread support is disabled at compile time.
|
||||
|
||||
All of the following functions are only available when thread support is enabled
|
||||
at compile time, and must be called only when the interpreter lock has been
|
||||
created.
|
||||
|
||||
|
||||
.. cfunction:: PyInterpreterState* PyInterpreterState_New()
|
||||
|
||||
Create a new interpreter state object. The interpreter lock need not be held,
|
||||
but may be held if it is necessary to serialize calls to this function.
|
||||
|
||||
|
||||
.. cfunction:: void PyInterpreterState_Clear(PyInterpreterState *interp)
|
||||
|
||||
Reset all information in an interpreter state object. The interpreter lock must
|
||||
be held.
|
||||
|
||||
|
||||
.. cfunction:: void PyInterpreterState_Delete(PyInterpreterState *interp)
|
||||
|
||||
Destroy an interpreter state object. The interpreter lock need not be held.
|
||||
The interpreter state must have been reset with a previous call to
|
||||
:cfunc:`PyInterpreterState_Clear`.
|
||||
|
||||
|
||||
.. cfunction:: PyThreadState* PyThreadState_New(PyInterpreterState *interp)
|
||||
|
||||
Create a new thread state object belonging to the given interpreter object. The
|
||||
interpreter lock need not be held, but may be held if it is necessary to
|
||||
serialize calls to this function.
|
||||
|
||||
|
||||
.. cfunction:: void PyThreadState_Clear(PyThreadState *tstate)
|
||||
|
||||
Reset all information in a thread state object. The interpreter lock must be
|
||||
held.
|
||||
|
||||
|
||||
.. cfunction:: void PyThreadState_Delete(PyThreadState *tstate)
|
||||
|
||||
Destroy a thread state object. The interpreter lock need not be held. The
|
||||
thread state must have been reset with a previous call to
|
||||
:cfunc:`PyThreadState_Clear`.
|
||||
|
||||
|
||||
.. cfunction:: PyThreadState* PyThreadState_Get()
|
||||
|
||||
Return the current thread state. The interpreter lock must be held. When the
|
||||
current thread state is *NULL*, this issues a fatal error (so that the caller
|
||||
needn't check for *NULL*).
|
||||
|
||||
|
||||
.. cfunction:: PyThreadState* PyThreadState_Swap(PyThreadState *tstate)
|
||||
|
||||
Swap the current thread state with the thread state given by the argument
|
||||
*tstate*, which may be *NULL*. The interpreter lock must be held.
|
||||
|
||||
|
||||
.. cfunction:: PyObject* PyThreadState_GetDict()
|
||||
|
||||
Return a dictionary in which extensions can store thread-specific state
|
||||
information. Each extension should use a unique key to use to store state in
|
||||
the dictionary. It is okay to call this function when no current thread state
|
||||
is available. If this function returns *NULL*, no exception has been raised and
|
||||
the caller should assume no current thread state is available.
|
||||
|
||||
.. versionchanged:: 2.3
|
||||
Previously this could only be called when a current thread is active, and *NULL*
|
||||
meant that an exception was raised.
|
||||
|
||||
|
||||
.. cfunction:: int PyThreadState_SetAsyncExc(long id, PyObject *exc)
|
||||
|
||||
Asynchronously raise an exception in a thread. The *id* argument is the thread
|
||||
id of the target thread; *exc* is the exception object to be raised. This
|
||||
function does not steal any references to *exc*. To prevent naive misuse, you
|
||||
must write your own C extension to call this. Must be called with the GIL held.
|
||||
Returns the number of thread states modified; this is normally one, but will be
|
||||
zero if the thread id isn't found. If *exc* is :const:`NULL`, the pending
|
||||
exception (if any) for the thread is cleared. This raises no exceptions.
|
||||
|
||||
.. versionadded:: 2.3
|
||||
|
||||
|
||||
.. cfunction:: PyGILState_STATE PyGILState_Ensure()
|
||||
|
||||
Ensure that the current thread is ready to call the Python C API regardless of
|
||||
the current state of Python, or of its thread lock. This may be called as many
|
||||
times as desired by a thread as long as each call is matched with a call to
|
||||
:cfunc:`PyGILState_Release`. In general, other thread-related APIs may be used
|
||||
between :cfunc:`PyGILState_Ensure` and :cfunc:`PyGILState_Release` calls as long
|
||||
as the thread state is restored to its previous state before the Release(). For
|
||||
example, normal usage of the :cmacro:`Py_BEGIN_ALLOW_THREADS` and
|
||||
:cmacro:`Py_END_ALLOW_THREADS` macros is acceptable.
|
||||
|
||||
The return value is an opaque "handle" to the thread state when
|
||||
:cfunc:`PyGILState_Acquire` was called, and must be passed to
|
||||
:cfunc:`PyGILState_Release` to ensure Python is left in the same state. Even
|
||||
though recursive calls are allowed, these handles *cannot* be shared - each
|
||||
unique call to :cfunc:`PyGILState_Ensure` must save the handle for its call to
|
||||
:cfunc:`PyGILState_Release`.
|
||||
|
||||
When the function returns, the current thread will hold the GIL. Failure is a
|
||||
fatal error.
|
||||
|
||||
.. versionadded:: 2.3
|
||||
|
||||
|
||||
.. cfunction:: void PyGILState_Release(PyGILState_STATE)
|
||||
|
||||
Release any resources previously acquired. After this call, Python's state will
|
||||
be the same as it was prior to the corresponding :cfunc:`PyGILState_Ensure` call
|
||||
(but generally this state will be unknown to the caller, hence the use of the
|
||||
GILState API.)
|
||||
|
||||
Every call to :cfunc:`PyGILState_Ensure` must be matched by a call to
|
||||
:cfunc:`PyGILState_Release` on the same thread.
|
||||
|
||||
.. versionadded:: 2.3
|
||||
|
||||
|
||||
.. _profiling:
|
||||
|
||||
Profiling and Tracing
|
||||
=====================
|
||||
|
||||
.. sectionauthor:: Fred L. Drake, Jr. <fdrake@acm.org>
|
||||
|
||||
|
||||
The Python interpreter provides some low-level support for attaching profiling
|
||||
and execution tracing facilities. These are used for profiling, debugging, and
|
||||
coverage analysis tools.
|
||||
|
||||
Starting with Python 2.2, the implementation of this facility was substantially
|
||||
revised, and an interface from C was added. This C interface allows the
|
||||
profiling or tracing code to avoid the overhead of calling through Python-level
|
||||
callable objects, making a direct C function call instead. The essential
|
||||
attributes of the facility have not changed; the interface allows trace
|
||||
functions to be installed per-thread, and the basic events reported to the trace
|
||||
function are the same as had been reported to the Python-level trace functions
|
||||
in previous versions.
|
||||
|
||||
|
||||
.. ctype:: int (*Py_tracefunc)(PyObject *obj, PyFrameObject *frame, int what, PyObject *arg)
|
||||
|
||||
The type of the trace function registered using :cfunc:`PyEval_SetProfile` and
|
||||
:cfunc:`PyEval_SetTrace`. The first parameter is the object passed to the
|
||||
registration function as *obj*, *frame* is the frame object to which the event
|
||||
pertains, *what* is one of the constants :const:`PyTrace_CALL`,
|
||||
:const:`PyTrace_EXCEPTION`, :const:`PyTrace_LINE`, :const:`PyTrace_RETURN`,
|
||||
:const:`PyTrace_C_CALL`, :const:`PyTrace_C_EXCEPTION`, or
|
||||
:const:`PyTrace_C_RETURN`, and *arg* depends on the value of *what*:
|
||||
|
||||
+------------------------------+--------------------------------------+
|
||||
| Value of *what* | Meaning of *arg* |
|
||||
+==============================+======================================+
|
||||
| :const:`PyTrace_CALL` | Always *NULL*. |
|
||||
+------------------------------+--------------------------------------+
|
||||
| :const:`PyTrace_EXCEPTION` | Exception information as returned by |
|
||||
| | :func:`sys.exc_info`. |
|
||||
+------------------------------+--------------------------------------+
|
||||
| :const:`PyTrace_LINE` | Always *NULL*. |
|
||||
+------------------------------+--------------------------------------+
|
||||
| :const:`PyTrace_RETURN` | Value being returned to the caller. |
|
||||
+------------------------------+--------------------------------------+
|
||||
| :const:`PyTrace_C_CALL` | Name of function being called. |
|
||||
+------------------------------+--------------------------------------+
|
||||
| :const:`PyTrace_C_EXCEPTION` | Always *NULL*. |
|
||||
+------------------------------+--------------------------------------+
|
||||
| :const:`PyTrace_C_RETURN` | Always *NULL*. |
|
||||
+------------------------------+--------------------------------------+
|
||||
|
||||
|
||||
.. cvar:: int PyTrace_CALL
|
||||
|
||||
The value of the *what* parameter to a :ctype:`Py_tracefunc` function when a new
|
||||
call to a function or method is being reported, or a new entry into a generator.
|
||||
Note that the creation of the iterator for a generator function is not reported
|
||||
as there is no control transfer to the Python bytecode in the corresponding
|
||||
frame.
|
||||
|
||||
|
||||
.. cvar:: int PyTrace_EXCEPTION
|
||||
|
||||
The value of the *what* parameter to a :ctype:`Py_tracefunc` function when an
|
||||
exception has been raised. The callback function is called with this value for
|
||||
*what* when after any bytecode is processed after which the exception becomes
|
||||
set within the frame being executed. The effect of this is that as exception
|
||||
propagation causes the Python stack to unwind, the callback is called upon
|
||||
return to each frame as the exception propagates. Only trace functions receives
|
||||
these events; they are not needed by the profiler.
|
||||
|
||||
|
||||
.. cvar:: int PyTrace_LINE
|
||||
|
||||
The value passed as the *what* parameter to a trace function (but not a
|
||||
profiling function) when a line-number event is being reported.
|
||||
|
||||
|
||||
.. cvar:: int PyTrace_RETURN
|
||||
|
||||
The value for the *what* parameter to :ctype:`Py_tracefunc` functions when a
|
||||
call is returning without propagating an exception.
|
||||
|
||||
|
||||
.. cvar:: int PyTrace_C_CALL
|
||||
|
||||
The value for the *what* parameter to :ctype:`Py_tracefunc` functions when a C
|
||||
function is about to be called.
|
||||
|
||||
|
||||
.. cvar:: int PyTrace_C_EXCEPTION
|
||||
|
||||
The value for the *what* parameter to :ctype:`Py_tracefunc` functions when a C
|
||||
function has thrown an exception.
|
||||
|
||||
|
||||
.. cvar:: int PyTrace_C_RETURN
|
||||
|
||||
The value for the *what* parameter to :ctype:`Py_tracefunc` functions when a C
|
||||
function has returned.
|
||||
|
||||
|
||||
.. cfunction:: void PyEval_SetProfile(Py_tracefunc func, PyObject *obj)
|
||||
|
||||
Set the profiler function to *func*. The *obj* parameter is passed to the
|
||||
function as its first parameter, and may be any Python object, or *NULL*. If
|
||||
the profile function needs to maintain state, using a different value for *obj*
|
||||
for each thread provides a convenient and thread-safe place to store it. The
|
||||
profile function is called for all monitored events except the line-number
|
||||
events.
|
||||
|
||||
|
||||
.. cfunction:: void PyEval_SetTrace(Py_tracefunc func, PyObject *obj)
|
||||
|
||||
Set the tracing function to *func*. This is similar to
|
||||
:cfunc:`PyEval_SetProfile`, except the tracing function does receive line-number
|
||||
events.
|
||||
|
||||
|
||||
.. _advanced-debugging:
|
||||
|
||||
Advanced Debugger Support
|
||||
=========================
|
||||
|
||||
.. sectionauthor:: Fred L. Drake, Jr. <fdrake@acm.org>
|
||||
|
||||
|
||||
These functions are only intended to be used by advanced debugging tools.
|
||||
|
||||
|
||||
.. cfunction:: PyInterpreterState* PyInterpreterState_Head()
|
||||
|
||||
Return the interpreter state object at the head of the list of all such objects.
|
||||
|
||||
.. versionadded:: 2.2
|
||||
|
||||
|
||||
.. cfunction:: PyInterpreterState* PyInterpreterState_Next(PyInterpreterState *interp)
|
||||
|
||||
Return the next interpreter state object after *interp* from the list of all
|
||||
such objects.
|
||||
|
||||
.. versionadded:: 2.2
|
||||
|
||||
|
||||
.. cfunction:: PyThreadState * PyInterpreterState_ThreadHead(PyInterpreterState *interp)
|
||||
|
||||
Return the a pointer to the first :ctype:`PyThreadState` object in the list of
|
||||
threads associated with the interpreter *interp*.
|
||||
|
||||
.. versionadded:: 2.2
|
||||
|
||||
|
||||
.. cfunction:: PyThreadState* PyThreadState_Next(PyThreadState *tstate)
|
||||
|
||||
Return the next thread state object after *tstate* from the list of all such
|
||||
objects belonging to the same :ctype:`PyInterpreterState` object.
|
||||
|
||||
.. versionadded:: 2.2
|
||||
|
||||
638
Doc-26/c-api/intro.rst
Normal file
638
Doc-26/c-api/intro.rst
Normal file
@@ -0,0 +1,638 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
|
||||
.. _intro:
|
||||
|
||||
************
|
||||
Introduction
|
||||
************
|
||||
|
||||
The Application Programmer's Interface to Python gives C and C++ programmers
|
||||
access to the Python interpreter at a variety of levels. The API is equally
|
||||
usable from C++, but for brevity it is generally referred to as the Python/C
|
||||
API. There are two fundamentally different reasons for using the Python/C API.
|
||||
The first reason is to write *extension modules* for specific purposes; these
|
||||
are C modules that extend the Python interpreter. This is probably the most
|
||||
common use. The second reason is to use Python as a component in a larger
|
||||
application; this technique is generally referred to as :dfn:`embedding` Python
|
||||
in an application.
|
||||
|
||||
Writing an extension module is a relatively well-understood process, where a
|
||||
"cookbook" approach works well. There are several tools that automate the
|
||||
process to some extent. While people have embedded Python in other
|
||||
applications since its early existence, the process of embedding Python is less
|
||||
straightforward than writing an extension.
|
||||
|
||||
Many API functions are useful independent of whether you're embedding or
|
||||
extending Python; moreover, most applications that embed Python will need to
|
||||
provide a custom extension as well, so it's probably a good idea to become
|
||||
familiar with writing an extension before attempting to embed Python in a real
|
||||
application.
|
||||
|
||||
|
||||
.. _includes:
|
||||
|
||||
Include Files
|
||||
=============
|
||||
|
||||
All function, type and macro definitions needed to use the Python/C API are
|
||||
included in your code by the following line::
|
||||
|
||||
#include "Python.h"
|
||||
|
||||
This implies inclusion of the following standard headers: ``<stdio.h>``,
|
||||
``<string.h>``, ``<errno.h>``, ``<limits.h>``, and ``<stdlib.h>`` (if
|
||||
available).
|
||||
|
||||
.. warning::
|
||||
|
||||
Since Python may define some pre-processor definitions which affect the standard
|
||||
headers on some systems, you *must* include :file:`Python.h` before any standard
|
||||
headers are included.
|
||||
|
||||
All user visible names defined by Python.h (except those defined by the included
|
||||
standard headers) have one of the prefixes ``Py`` or ``_Py``. Names beginning
|
||||
with ``_Py`` are for internal use by the Python implementation and should not be
|
||||
used by extension writers. Structure member names do not have a reserved prefix.
|
||||
|
||||
**Important:** user code should never define names that begin with ``Py`` or
|
||||
``_Py``. This confuses the reader, and jeopardizes the portability of the user
|
||||
code to future Python versions, which may define additional names beginning with
|
||||
one of these prefixes.
|
||||
|
||||
The header files are typically installed with Python. On Unix, these are
|
||||
located in the directories :file:`{prefix}/include/pythonversion/` and
|
||||
:file:`{exec_prefix}/include/pythonversion/`, where :envvar:`prefix` and
|
||||
:envvar:`exec_prefix` are defined by the corresponding parameters to Python's
|
||||
:program:`configure` script and *version* is ``sys.version[:3]``. On Windows,
|
||||
the headers are installed in :file:`{prefix}/include`, where :envvar:`prefix` is
|
||||
the installation directory specified to the installer.
|
||||
|
||||
To include the headers, place both directories (if different) on your compiler's
|
||||
search path for includes. Do *not* place the parent directories on the search
|
||||
path and then use ``#include <python|version|/Python.h>``; this will break on
|
||||
multi-platform builds since the platform independent headers under
|
||||
:envvar:`prefix` include the platform specific headers from
|
||||
:envvar:`exec_prefix`.
|
||||
|
||||
C++ users should note that though the API is defined entirely using C, the
|
||||
header files do properly declare the entry points to be ``extern "C"``, so there
|
||||
is no need to do anything special to use the API from C++.
|
||||
|
||||
|
||||
.. _objects:
|
||||
|
||||
Objects, Types and Reference Counts
|
||||
===================================
|
||||
|
||||
.. index:: object: type
|
||||
|
||||
Most Python/C API functions have one or more arguments as well as a return value
|
||||
of type :ctype:`PyObject\*`. This type is a pointer to an opaque data type
|
||||
representing an arbitrary Python object. Since all Python object types are
|
||||
treated the same way by the Python language in most situations (e.g.,
|
||||
assignments, scope rules, and argument passing), it is only fitting that they
|
||||
should be represented by a single C type. Almost all Python objects live on the
|
||||
heap: you never declare an automatic or static variable of type
|
||||
:ctype:`PyObject`, only pointer variables of type :ctype:`PyObject\*` can be
|
||||
declared. The sole exception are the type objects; since these must never be
|
||||
deallocated, they are typically static :ctype:`PyTypeObject` objects.
|
||||
|
||||
All Python objects (even Python integers) have a :dfn:`type` and a
|
||||
:dfn:`reference count`. An object's type determines what kind of object it is
|
||||
(e.g., an integer, a list, or a user-defined function; there are many more as
|
||||
explained in the Python Reference Manual (XXX reference: ../ref/ref.html)). For
|
||||
each of the well-known types there is a macro to check whether an object is of
|
||||
that type; for instance, ``PyList_Check(a)`` is true if (and only if) the object
|
||||
pointed to by *a* is a Python list.
|
||||
|
||||
|
||||
.. _refcounts:
|
||||
|
||||
Reference Counts
|
||||
----------------
|
||||
|
||||
The reference count is important because today's computers have a finite (and
|
||||
often severely limited) memory size; it counts how many different places there
|
||||
are that have a reference to an object. Such a place could be another object,
|
||||
or a global (or static) C variable, or a local variable in some C function.
|
||||
When an object's reference count becomes zero, the object is deallocated. If
|
||||
it contains references to other objects, their reference count is decremented.
|
||||
Those other objects may be deallocated in turn, if this decrement makes their
|
||||
reference count become zero, and so on. (There's an obvious problem with
|
||||
objects that reference each other here; for now, the solution is "don't do
|
||||
that.")
|
||||
|
||||
.. index::
|
||||
single: Py_INCREF()
|
||||
single: Py_DECREF()
|
||||
|
||||
Reference counts are always manipulated explicitly. The normal way is to use
|
||||
the macro :cfunc:`Py_INCREF` to increment an object's reference count by one,
|
||||
and :cfunc:`Py_DECREF` to decrement it by one. The :cfunc:`Py_DECREF` macro
|
||||
is considerably more complex than the incref one, since it must check whether
|
||||
the reference count becomes zero and then cause the object's deallocator to be
|
||||
called. The deallocator is a function pointer contained in the object's type
|
||||
structure. The type-specific deallocator takes care of decrementing the
|
||||
reference counts for other objects contained in the object if this is a compound
|
||||
object type, such as a list, as well as performing any additional finalization
|
||||
that's needed. There's no chance that the reference count can overflow; at
|
||||
least as many bits are used to hold the reference count as there are distinct
|
||||
memory locations in virtual memory (assuming ``sizeof(long) >= sizeof(char*)``).
|
||||
Thus, the reference count increment is a simple operation.
|
||||
|
||||
It is not necessary to increment an object's reference count for every local
|
||||
variable that contains a pointer to an object. In theory, the object's
|
||||
reference count goes up by one when the variable is made to point to it and it
|
||||
goes down by one when the variable goes out of scope. However, these two
|
||||
cancel each other out, so at the end the reference count hasn't changed. The
|
||||
only real reason to use the reference count is to prevent the object from being
|
||||
deallocated as long as our variable is pointing to it. If we know that there
|
||||
is at least one other reference to the object that lives at least as long as
|
||||
our variable, there is no need to increment the reference count temporarily.
|
||||
An important situation where this arises is in objects that are passed as
|
||||
arguments to C functions in an extension module that are called from Python;
|
||||
the call mechanism guarantees to hold a reference to every argument for the
|
||||
duration of the call.
|
||||
|
||||
However, a common pitfall is to extract an object from a list and hold on to it
|
||||
for a while without incrementing its reference count. Some other operation might
|
||||
conceivably remove the object from the list, decrementing its reference count
|
||||
and possible deallocating it. The real danger is that innocent-looking
|
||||
operations may invoke arbitrary Python code which could do this; there is a code
|
||||
path which allows control to flow back to the user from a :cfunc:`Py_DECREF`, so
|
||||
almost any operation is potentially dangerous.
|
||||
|
||||
A safe approach is to always use the generic operations (functions whose name
|
||||
begins with ``PyObject_``, ``PyNumber_``, ``PySequence_`` or ``PyMapping_``).
|
||||
These operations always increment the reference count of the object they return.
|
||||
This leaves the caller with the responsibility to call :cfunc:`Py_DECREF` when
|
||||
they are done with the result; this soon becomes second nature.
|
||||
|
||||
|
||||
.. _refcountdetails:
|
||||
|
||||
Reference Count Details
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The reference count behavior of functions in the Python/C API is best explained
|
||||
in terms of *ownership of references*. Ownership pertains to references, never
|
||||
to objects (objects are not owned: they are always shared). "Owning a
|
||||
reference" means being responsible for calling Py_DECREF on it when the
|
||||
reference is no longer needed. Ownership can also be transferred, meaning that
|
||||
the code that receives ownership of the reference then becomes responsible for
|
||||
eventually decref'ing it by calling :cfunc:`Py_DECREF` or :cfunc:`Py_XDECREF`
|
||||
when it's no longer needed---or passing on this responsibility (usually to its
|
||||
caller). When a function passes ownership of a reference on to its caller, the
|
||||
caller is said to receive a *new* reference. When no ownership is transferred,
|
||||
the caller is said to *borrow* the reference. Nothing needs to be done for a
|
||||
borrowed reference.
|
||||
|
||||
Conversely, when a calling function passes it a reference to an object, there
|
||||
are two possibilities: the function *steals* a reference to the object, or it
|
||||
does not. *Stealing a reference* means that when you pass a reference to a
|
||||
function, that function assumes that it now owns that reference, and you are not
|
||||
responsible for it any longer.
|
||||
|
||||
.. index::
|
||||
single: PyList_SetItem()
|
||||
single: PyTuple_SetItem()
|
||||
|
||||
Few functions steal references; the two notable exceptions are
|
||||
:cfunc:`PyList_SetItem` and :cfunc:`PyTuple_SetItem`, which steal a reference
|
||||
to the item (but not to the tuple or list into which the item is put!). These
|
||||
functions were designed to steal a reference because of a common idiom for
|
||||
populating a tuple or list with newly created objects; for example, the code to
|
||||
create the tuple ``(1, 2, "three")`` could look like this (forgetting about
|
||||
error handling for the moment; a better way to code this is shown below)::
|
||||
|
||||
PyObject *t;
|
||||
|
||||
t = PyTuple_New(3);
|
||||
PyTuple_SetItem(t, 0, PyInt_FromLong(1L));
|
||||
PyTuple_SetItem(t, 1, PyInt_FromLong(2L));
|
||||
PyTuple_SetItem(t, 2, PyString_FromString("three"));
|
||||
|
||||
Here, :cfunc:`PyInt_FromLong` returns a new reference which is immediately
|
||||
stolen by :cfunc:`PyTuple_SetItem`. When you want to keep using an object
|
||||
although the reference to it will be stolen, use :cfunc:`Py_INCREF` to grab
|
||||
another reference before calling the reference-stealing function.
|
||||
|
||||
Incidentally, :cfunc:`PyTuple_SetItem` is the *only* way to set tuple items;
|
||||
:cfunc:`PySequence_SetItem` and :cfunc:`PyObject_SetItem` refuse to do this
|
||||
since tuples are an immutable data type. You should only use
|
||||
:cfunc:`PyTuple_SetItem` for tuples that you are creating yourself.
|
||||
|
||||
Equivalent code for populating a list can be written using :cfunc:`PyList_New`
|
||||
and :cfunc:`PyList_SetItem`.
|
||||
|
||||
However, in practice, you will rarely use these ways of creating and populating
|
||||
a tuple or list. There's a generic function, :cfunc:`Py_BuildValue`, that can
|
||||
create most common objects from C values, directed by a :dfn:`format string`.
|
||||
For example, the above two blocks of code could be replaced by the following
|
||||
(which also takes care of the error checking)::
|
||||
|
||||
PyObject *tuple, *list;
|
||||
|
||||
tuple = Py_BuildValue("(iis)", 1, 2, "three");
|
||||
list = Py_BuildValue("[iis]", 1, 2, "three");
|
||||
|
||||
It is much more common to use :cfunc:`PyObject_SetItem` and friends with items
|
||||
whose references you are only borrowing, like arguments that were passed in to
|
||||
the function you are writing. In that case, their behaviour regarding reference
|
||||
counts is much saner, since you don't have to increment a reference count so you
|
||||
can give a reference away ("have it be stolen"). For example, this function
|
||||
sets all items of a list (actually, any mutable sequence) to a given item::
|
||||
|
||||
int
|
||||
set_all(PyObject *target, PyObject *item)
|
||||
{
|
||||
int i, n;
|
||||
|
||||
n = PyObject_Length(target);
|
||||
if (n < 0)
|
||||
return -1;
|
||||
for (i = 0; i < n; i++) {
|
||||
PyObject *index = PyInt_FromLong(i);
|
||||
if (!index)
|
||||
return -1;
|
||||
if (PyObject_SetItem(target, index, item) < 0)
|
||||
return -1;
|
||||
Py_DECREF(index);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
.. index:: single: set_all()
|
||||
|
||||
The situation is slightly different for function return values. While passing
|
||||
a reference to most functions does not change your ownership responsibilities
|
||||
for that reference, many functions that return a reference to an object give
|
||||
you ownership of the reference. The reason is simple: in many cases, the
|
||||
returned object is created on the fly, and the reference you get is the only
|
||||
reference to the object. Therefore, the generic functions that return object
|
||||
references, like :cfunc:`PyObject_GetItem` and :cfunc:`PySequence_GetItem`,
|
||||
always return a new reference (the caller becomes the owner of the reference).
|
||||
|
||||
It is important to realize that whether you own a reference returned by a
|
||||
function depends on which function you call only --- *the plumage* (the type of
|
||||
the object passed as an argument to the function) *doesn't enter into it!*
|
||||
Thus, if you extract an item from a list using :cfunc:`PyList_GetItem`, you
|
||||
don't own the reference --- but if you obtain the same item from the same list
|
||||
using :cfunc:`PySequence_GetItem` (which happens to take exactly the same
|
||||
arguments), you do own a reference to the returned object.
|
||||
|
||||
.. index::
|
||||
single: PyList_GetItem()
|
||||
single: PySequence_GetItem()
|
||||
|
||||
Here is an example of how you could write a function that computes the sum of
|
||||
the items in a list of integers; once using :cfunc:`PyList_GetItem`, and once
|
||||
using :cfunc:`PySequence_GetItem`. ::
|
||||
|
||||
long
|
||||
sum_list(PyObject *list)
|
||||
{
|
||||
int i, n;
|
||||
long total = 0;
|
||||
PyObject *item;
|
||||
|
||||
n = PyList_Size(list);
|
||||
if (n < 0)
|
||||
return -1; /* Not a list */
|
||||
for (i = 0; i < n; i++) {
|
||||
item = PyList_GetItem(list, i); /* Can't fail */
|
||||
if (!PyInt_Check(item)) continue; /* Skip non-integers */
|
||||
total += PyInt_AsLong(item);
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
.. index:: single: sum_list()
|
||||
|
||||
::
|
||||
|
||||
long
|
||||
sum_sequence(PyObject *sequence)
|
||||
{
|
||||
int i, n;
|
||||
long total = 0;
|
||||
PyObject *item;
|
||||
n = PySequence_Length(sequence);
|
||||
if (n < 0)
|
||||
return -1; /* Has no length */
|
||||
for (i = 0; i < n; i++) {
|
||||
item = PySequence_GetItem(sequence, i);
|
||||
if (item == NULL)
|
||||
return -1; /* Not a sequence, or other failure */
|
||||
if (PyInt_Check(item))
|
||||
total += PyInt_AsLong(item);
|
||||
Py_DECREF(item); /* Discard reference ownership */
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
.. index:: single: sum_sequence()
|
||||
|
||||
|
||||
.. _types:
|
||||
|
||||
Types
|
||||
-----
|
||||
|
||||
There are few other data types that play a significant role in the Python/C
|
||||
API; most are simple C types such as :ctype:`int`, :ctype:`long`,
|
||||
:ctype:`double` and :ctype:`char\*`. A few structure types are used to
|
||||
describe static tables used to list the functions exported by a module or the
|
||||
data attributes of a new object type, and another is used to describe the value
|
||||
of a complex number. These will be discussed together with the functions that
|
||||
use them.
|
||||
|
||||
|
||||
.. _exceptions:
|
||||
|
||||
Exceptions
|
||||
==========
|
||||
|
||||
The Python programmer only needs to deal with exceptions if specific error
|
||||
handling is required; unhandled exceptions are automatically propagated to the
|
||||
caller, then to the caller's caller, and so on, until they reach the top-level
|
||||
interpreter, where they are reported to the user accompanied by a stack
|
||||
traceback.
|
||||
|
||||
.. index:: single: PyErr_Occurred()
|
||||
|
||||
For C programmers, however, error checking always has to be explicit. All
|
||||
functions in the Python/C API can raise exceptions, unless an explicit claim is
|
||||
made otherwise in a function's documentation. In general, when a function
|
||||
encounters an error, it sets an exception, discards any object references that
|
||||
it owns, and returns an error indicator --- usually *NULL* or ``-1``. A few
|
||||
functions return a Boolean true/false result, with false indicating an error.
|
||||
Very few functions return no explicit error indicator or have an ambiguous
|
||||
return value, and require explicit testing for errors with
|
||||
:cfunc:`PyErr_Occurred`.
|
||||
|
||||
.. index::
|
||||
single: PyErr_SetString()
|
||||
single: PyErr_Clear()
|
||||
|
||||
Exception state is maintained in per-thread storage (this is equivalent to
|
||||
using global storage in an unthreaded application). A thread can be in one of
|
||||
two states: an exception has occurred, or not. The function
|
||||
:cfunc:`PyErr_Occurred` can be used to check for this: it returns a borrowed
|
||||
reference to the exception type object when an exception has occurred, and
|
||||
*NULL* otherwise. There are a number of functions to set the exception state:
|
||||
:cfunc:`PyErr_SetString` is the most common (though not the most general)
|
||||
function to set the exception state, and :cfunc:`PyErr_Clear` clears the
|
||||
exception state.
|
||||
|
||||
.. index::
|
||||
single: exc_type (in module sys)
|
||||
single: exc_value (in module sys)
|
||||
single: exc_traceback (in module sys)
|
||||
|
||||
The full exception state consists of three objects (all of which can be
|
||||
*NULL*): the exception type, the corresponding exception value, and the
|
||||
traceback. These have the same meanings as the Python objects
|
||||
``sys.exc_type``, ``sys.exc_value``, and ``sys.exc_traceback``; however, they
|
||||
are not the same: the Python objects represent the last exception being handled
|
||||
by a Python :keyword:`try` ... :keyword:`except` statement, while the C level
|
||||
exception state only exists while an exception is being passed on between C
|
||||
functions until it reaches the Python bytecode interpreter's main loop, which
|
||||
takes care of transferring it to ``sys.exc_type`` and friends.
|
||||
|
||||
.. index:: single: exc_info() (in module sys)
|
||||
|
||||
Note that starting with Python 1.5, the preferred, thread-safe way to access
|
||||
the exception state from Python code is to call the function
|
||||
:func:`sys.exc_info`, which returns the per-thread exception state for Python
|
||||
code. Also, the semantics of both ways to access the exception state have
|
||||
changed so that a function which catches an exception will save and restore its
|
||||
thread's exception state so as to preserve the exception state of its caller.
|
||||
This prevents common bugs in exception handling code caused by an innocent-
|
||||
looking function overwriting the exception being handled; it also reduces the
|
||||
often unwanted lifetime extension for objects that are referenced by the stack
|
||||
frames in the traceback.
|
||||
|
||||
As a general principle, a function that calls another function to perform some
|
||||
task should check whether the called function raised an exception, and if so,
|
||||
pass the exception state on to its caller. It should discard any object
|
||||
references that it owns, and return an error indicator, but it should *not* set
|
||||
another exception --- that would overwrite the exception that was just raised,
|
||||
and lose important information about the exact cause of the error.
|
||||
|
||||
.. index:: single: sum_sequence()
|
||||
|
||||
A simple example of detecting exceptions and passing them on is shown in the
|
||||
:cfunc:`sum_sequence` example above. It so happens that that example doesn't
|
||||
need to clean up any owned references when it detects an error. The following
|
||||
example function shows some error cleanup. First, to remind you why you like
|
||||
Python, we show the equivalent Python code::
|
||||
|
||||
def incr_item(dict, key):
|
||||
try:
|
||||
item = dict[key]
|
||||
except KeyError:
|
||||
item = 0
|
||||
dict[key] = item + 1
|
||||
|
||||
.. index:: single: incr_item()
|
||||
|
||||
Here is the corresponding C code, in all its glory::
|
||||
|
||||
int
|
||||
incr_item(PyObject *dict, PyObject *key)
|
||||
{
|
||||
/* Objects all initialized to NULL for Py_XDECREF */
|
||||
PyObject *item = NULL, *const_one = NULL, *incremented_item = NULL;
|
||||
int rv = -1; /* Return value initialized to -1 (failure) */
|
||||
|
||||
item = PyObject_GetItem(dict, key);
|
||||
if (item == NULL) {
|
||||
/* Handle KeyError only: */
|
||||
if (!PyErr_ExceptionMatches(PyExc_KeyError))
|
||||
goto error;
|
||||
|
||||
/* Clear the error and use zero: */
|
||||
PyErr_Clear();
|
||||
item = PyInt_FromLong(0L);
|
||||
if (item == NULL)
|
||||
goto error;
|
||||
}
|
||||
const_one = PyInt_FromLong(1L);
|
||||
if (const_one == NULL)
|
||||
goto error;
|
||||
|
||||
incremented_item = PyNumber_Add(item, const_one);
|
||||
if (incremented_item == NULL)
|
||||
goto error;
|
||||
|
||||
if (PyObject_SetItem(dict, key, incremented_item) < 0)
|
||||
goto error;
|
||||
rv = 0; /* Success */
|
||||
/* Continue with cleanup code */
|
||||
|
||||
error:
|
||||
/* Cleanup code, shared by success and failure path */
|
||||
|
||||
/* Use Py_XDECREF() to ignore NULL references */
|
||||
Py_XDECREF(item);
|
||||
Py_XDECREF(const_one);
|
||||
Py_XDECREF(incremented_item);
|
||||
|
||||
return rv; /* -1 for error, 0 for success */
|
||||
}
|
||||
|
||||
.. index:: single: incr_item()
|
||||
|
||||
.. index::
|
||||
single: PyErr_ExceptionMatches()
|
||||
single: PyErr_Clear()
|
||||
single: Py_XDECREF()
|
||||
|
||||
This example represents an endorsed use of the :keyword:`goto` statement in C!
|
||||
It illustrates the use of :cfunc:`PyErr_ExceptionMatches` and
|
||||
:cfunc:`PyErr_Clear` to handle specific exceptions, and the use of
|
||||
:cfunc:`Py_XDECREF` to dispose of owned references that may be *NULL* (note the
|
||||
``'X'`` in the name; :cfunc:`Py_DECREF` would crash when confronted with a
|
||||
*NULL* reference). It is important that the variables used to hold owned
|
||||
references are initialized to *NULL* for this to work; likewise, the proposed
|
||||
return value is initialized to ``-1`` (failure) and only set to success after
|
||||
the final call made is successful.
|
||||
|
||||
|
||||
.. _embedding:
|
||||
|
||||
Embedding Python
|
||||
================
|
||||
|
||||
The one important task that only embedders (as opposed to extension writers) of
|
||||
the Python interpreter have to worry about is the initialization, and possibly
|
||||
the finalization, of the Python interpreter. Most functionality of the
|
||||
interpreter can only be used after the interpreter has been initialized.
|
||||
|
||||
.. index::
|
||||
single: Py_Initialize()
|
||||
module: __builtin__
|
||||
module: __main__
|
||||
module: sys
|
||||
module: exceptions
|
||||
triple: module; search; path
|
||||
single: path (in module sys)
|
||||
|
||||
The basic initialization function is :cfunc:`Py_Initialize`. This initializes
|
||||
the table of loaded modules, and creates the fundamental modules
|
||||
:mod:`__builtin__`, :mod:`__main__`, :mod:`sys`, and :mod:`exceptions`. It also
|
||||
initializes the module search path (``sys.path``).
|
||||
|
||||
.. %
|
||||
|
||||
.. index:: single: PySys_SetArgv()
|
||||
|
||||
:cfunc:`Py_Initialize` does not set the "script argument list" (``sys.argv``).
|
||||
If this variable is needed by Python code that will be executed later, it must
|
||||
be set explicitly with a call to ``PySys_SetArgv(argc, argv)`` subsequent to
|
||||
the call to :cfunc:`Py_Initialize`.
|
||||
|
||||
On most systems (in particular, on Unix and Windows, although the details are
|
||||
slightly different), :cfunc:`Py_Initialize` calculates the module search path
|
||||
based upon its best guess for the location of the standard Python interpreter
|
||||
executable, assuming that the Python library is found in a fixed location
|
||||
relative to the Python interpreter executable. In particular, it looks for a
|
||||
directory named :file:`lib/python|version|` relative to the parent directory
|
||||
where the executable named :file:`python` is found on the shell command search
|
||||
path (the environment variable :envvar:`PATH`).
|
||||
|
||||
For instance, if the Python executable is found in
|
||||
:file:`/usr/local/bin/python`, it will assume that the libraries are in
|
||||
:file:`/usr/local/lib/python|version|`. (In fact, this particular path is also
|
||||
the "fallback" location, used when no executable file named :file:`python` is
|
||||
found along :envvar:`PATH`.) The user can override this behavior by setting the
|
||||
environment variable :envvar:`PYTHONHOME`, or insert additional directories in
|
||||
front of the standard path by setting :envvar:`PYTHONPATH`.
|
||||
|
||||
.. index::
|
||||
single: Py_SetProgramName()
|
||||
single: Py_GetPath()
|
||||
single: Py_GetPrefix()
|
||||
single: Py_GetExecPrefix()
|
||||
single: Py_GetProgramFullPath()
|
||||
|
||||
The embedding application can steer the search by calling
|
||||
``Py_SetProgramName(file)`` *before* calling :cfunc:`Py_Initialize`. Note that
|
||||
:envvar:`PYTHONHOME` still overrides this and :envvar:`PYTHONPATH` is still
|
||||
inserted in front of the standard path. An application that requires total
|
||||
control has to provide its own implementation of :cfunc:`Py_GetPath`,
|
||||
:cfunc:`Py_GetPrefix`, :cfunc:`Py_GetExecPrefix`, and
|
||||
:cfunc:`Py_GetProgramFullPath` (all defined in :file:`Modules/getpath.c`).
|
||||
|
||||
.. index:: single: Py_IsInitialized()
|
||||
|
||||
Sometimes, it is desirable to "uninitialize" Python. For instance, the
|
||||
application may want to start over (make another call to
|
||||
:cfunc:`Py_Initialize`) or the application is simply done with its use of
|
||||
Python and wants to free memory allocated by Python. This can be accomplished
|
||||
by calling :cfunc:`Py_Finalize`. The function :cfunc:`Py_IsInitialized` returns
|
||||
true if Python is currently in the initialized state. More information about
|
||||
these functions is given in a later chapter. Notice that :cfunc:`Py_Finalize`
|
||||
does *not* free all memory allocated by the Python interpreter, e.g. memory
|
||||
allocated by extension modules currently cannot be released.
|
||||
|
||||
|
||||
.. _debugging:
|
||||
|
||||
Debugging Builds
|
||||
================
|
||||
|
||||
Python can be built with several macros to enable extra checks of the
|
||||
interpreter and extension modules. These checks tend to add a large amount of
|
||||
overhead to the runtime so they are not enabled by default.
|
||||
|
||||
A full list of the various types of debugging builds is in the file
|
||||
:file:`Misc/SpecialBuilds.txt` in the Python source distribution. Builds are
|
||||
available that support tracing of reference counts, debugging the memory
|
||||
allocator, or low-level profiling of the main interpreter loop. Only the most
|
||||
frequently-used builds will be described in the remainder of this section.
|
||||
|
||||
Compiling the interpreter with the :cmacro:`Py_DEBUG` macro defined produces
|
||||
what is generally meant by "a debug build" of Python. :cmacro:`Py_DEBUG` is
|
||||
enabled in the Unix build by adding :option:`--with-pydebug` to the
|
||||
:file:`configure` command. It is also implied by the presence of the not-
|
||||
Python-specific :cmacro:`_DEBUG` macro. When :cmacro:`Py_DEBUG` is enabled in
|
||||
the Unix build, compiler optimization is disabled.
|
||||
|
||||
In addition to the reference count debugging described below, the following
|
||||
extra checks are performed:
|
||||
|
||||
* Extra checks are added to the object allocator.
|
||||
|
||||
* Extra checks are added to the parser and compiler.
|
||||
|
||||
* Downcasts from wide types to narrow types are checked for loss of information.
|
||||
|
||||
* A number of assertions are added to the dictionary and set implementations.
|
||||
In addition, the set object acquires a :meth:`test_c_api` method.
|
||||
|
||||
* Sanity checks of the input arguments are added to frame creation.
|
||||
|
||||
* The storage for long ints is initialized with a known invalid pattern to catch
|
||||
reference to uninitialized digits.
|
||||
|
||||
* Low-level tracing and extra exception checking are added to the runtime
|
||||
virtual machine.
|
||||
|
||||
* Extra checks are added to the memory arena implementation.
|
||||
|
||||
* Extra debugging is added to the thread module.
|
||||
|
||||
There may be additional checks not mentioned here.
|
||||
|
||||
Defining :cmacro:`Py_TRACE_REFS` enables reference tracing. When defined, a
|
||||
circular doubly linked list of active objects is maintained by adding two extra
|
||||
fields to every :ctype:`PyObject`. Total allocations are tracked as well. Upon
|
||||
exit, all existing references are printed. (In interactive mode this happens
|
||||
after every statement run by the interpreter.) Implied by :cmacro:`Py_DEBUG`.
|
||||
|
||||
Please refer to :file:`Misc/SpecialBuilds.txt` in the Python source distribution
|
||||
for more detailed information.
|
||||
|
||||
207
Doc-26/c-api/memory.rst
Normal file
207
Doc-26/c-api/memory.rst
Normal file
@@ -0,0 +1,207 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
|
||||
.. _memory:
|
||||
|
||||
*****************
|
||||
Memory Management
|
||||
*****************
|
||||
|
||||
.. sectionauthor:: Vladimir Marangozov <Vladimir.Marangozov@inrialpes.fr>
|
||||
|
||||
|
||||
|
||||
.. _memoryoverview:
|
||||
|
||||
Overview
|
||||
========
|
||||
|
||||
Memory management in Python involves a private heap containing all Python
|
||||
objects and data structures. The management of this private heap is ensured
|
||||
internally by the *Python memory manager*. The Python memory manager has
|
||||
different components which deal with various dynamic storage management aspects,
|
||||
like sharing, segmentation, preallocation or caching.
|
||||
|
||||
At the lowest level, a raw memory allocator ensures that there is enough room in
|
||||
the private heap for storing all Python-related data by interacting with the
|
||||
memory manager of the operating system. On top of the raw memory allocator,
|
||||
several object-specific allocators operate on the same heap and implement
|
||||
distinct memory management policies adapted to the peculiarities of every object
|
||||
type. For example, integer objects are managed differently within the heap than
|
||||
strings, tuples or dictionaries because integers imply different storage
|
||||
requirements and speed/space tradeoffs. The Python memory manager thus delegates
|
||||
some of the work to the object-specific allocators, but ensures that the latter
|
||||
operate within the bounds of the private heap.
|
||||
|
||||
It is important to understand that the management of the Python heap is
|
||||
performed by the interpreter itself and that the user has no control over it,
|
||||
even if she regularly manipulates object pointers to memory blocks inside that
|
||||
heap. The allocation of heap space for Python objects and other internal
|
||||
buffers is performed on demand by the Python memory manager through the Python/C
|
||||
API functions listed in this document.
|
||||
|
||||
.. index::
|
||||
single: malloc()
|
||||
single: calloc()
|
||||
single: realloc()
|
||||
single: free()
|
||||
|
||||
To avoid memory corruption, extension writers should never try to operate on
|
||||
Python objects with the functions exported by the C library: :cfunc:`malloc`,
|
||||
:cfunc:`calloc`, :cfunc:`realloc` and :cfunc:`free`. This will result in mixed
|
||||
calls between the C allocator and the Python memory manager with fatal
|
||||
consequences, because they implement different algorithms and operate on
|
||||
different heaps. However, one may safely allocate and release memory blocks
|
||||
with the C library allocator for individual purposes, as shown in the following
|
||||
example::
|
||||
|
||||
PyObject *res;
|
||||
char *buf = (char *) malloc(BUFSIZ); /* for I/O */
|
||||
|
||||
if (buf == NULL)
|
||||
return PyErr_NoMemory();
|
||||
...Do some I/O operation involving buf...
|
||||
res = PyString_FromString(buf);
|
||||
free(buf); /* malloc'ed */
|
||||
return res;
|
||||
|
||||
In this example, the memory request for the I/O buffer is handled by the C
|
||||
library allocator. The Python memory manager is involved only in the allocation
|
||||
of the string object returned as a result.
|
||||
|
||||
In most situations, however, it is recommended to allocate memory from the
|
||||
Python heap specifically because the latter is under control of the Python
|
||||
memory manager. For example, this is required when the interpreter is extended
|
||||
with new object types written in C. Another reason for using the Python heap is
|
||||
the desire to *inform* the Python memory manager about the memory needs of the
|
||||
extension module. Even when the requested memory is used exclusively for
|
||||
internal, highly-specific purposes, delegating all memory requests to the Python
|
||||
memory manager causes the interpreter to have a more accurate image of its
|
||||
memory footprint as a whole. Consequently, under certain circumstances, the
|
||||
Python memory manager may or may not trigger appropriate actions, like garbage
|
||||
collection, memory compaction or other preventive procedures. Note that by using
|
||||
the C library allocator as shown in the previous example, the allocated memory
|
||||
for the I/O buffer escapes completely the Python memory manager.
|
||||
|
||||
|
||||
.. _memoryinterface:
|
||||
|
||||
Memory Interface
|
||||
================
|
||||
|
||||
The following function sets, modeled after the ANSI C standard, but specifying
|
||||
behavior when requesting zero bytes, are available for allocating and releasing
|
||||
memory from the Python heap:
|
||||
|
||||
|
||||
.. cfunction:: void* PyMem_Malloc(size_t n)
|
||||
|
||||
Allocates *n* bytes and returns a pointer of type :ctype:`void\*` to the
|
||||
allocated memory, or *NULL* if the request fails. Requesting zero bytes returns
|
||||
a distinct non-*NULL* pointer if possible, as if :cfunc:`PyMem_Malloc(1)` had
|
||||
been called instead. The memory will not have been initialized in any way.
|
||||
|
||||
|
||||
.. cfunction:: void* PyMem_Realloc(void *p, size_t n)
|
||||
|
||||
Resizes the memory block pointed to by *p* to *n* bytes. The contents will be
|
||||
unchanged to the minimum of the old and the new sizes. If *p* is *NULL*, the
|
||||
call is equivalent to :cfunc:`PyMem_Malloc(n)`; else if *n* is equal to zero,
|
||||
the memory block is resized but is not freed, and the returned pointer is
|
||||
non-*NULL*. Unless *p* is *NULL*, it must have been returned by a previous call
|
||||
to :cfunc:`PyMem_Malloc` or :cfunc:`PyMem_Realloc`. If the request fails,
|
||||
:cfunc:`PyMem_Realloc` returns *NULL* and *p* remains a valid pointer to the
|
||||
previous memory area.
|
||||
|
||||
|
||||
.. cfunction:: void PyMem_Free(void *p)
|
||||
|
||||
Frees the memory block pointed to by *p*, which must have been returned by a
|
||||
previous call to :cfunc:`PyMem_Malloc` or :cfunc:`PyMem_Realloc`. Otherwise, or
|
||||
if :cfunc:`PyMem_Free(p)` has been called before, undefined behavior occurs. If
|
||||
*p* is *NULL*, no operation is performed.
|
||||
|
||||
The following type-oriented macros are provided for convenience. Note that
|
||||
*TYPE* refers to any C type.
|
||||
|
||||
|
||||
.. cfunction:: TYPE* PyMem_New(TYPE, size_t n)
|
||||
|
||||
Same as :cfunc:`PyMem_Malloc`, but allocates ``(n * sizeof(TYPE))`` bytes of
|
||||
memory. Returns a pointer cast to :ctype:`TYPE\*`. The memory will not have
|
||||
been initialized in any way.
|
||||
|
||||
|
||||
.. cfunction:: TYPE* PyMem_Resize(void *p, TYPE, size_t n)
|
||||
|
||||
Same as :cfunc:`PyMem_Realloc`, but the memory block is resized to ``(n *
|
||||
sizeof(TYPE))`` bytes. Returns a pointer cast to :ctype:`TYPE\*`. On return,
|
||||
*p* will be a pointer to the new memory area, or *NULL* in the event of failure.
|
||||
|
||||
|
||||
.. cfunction:: void PyMem_Del(void *p)
|
||||
|
||||
Same as :cfunc:`PyMem_Free`.
|
||||
|
||||
In addition, the following macro sets are provided for calling the Python memory
|
||||
allocator directly, without involving the C API functions listed above. However,
|
||||
note that their use does not preserve binary compatibility across Python
|
||||
versions and is therefore deprecated in extension modules.
|
||||
|
||||
:cfunc:`PyMem_MALLOC`, :cfunc:`PyMem_REALLOC`, :cfunc:`PyMem_FREE`.
|
||||
|
||||
:cfunc:`PyMem_NEW`, :cfunc:`PyMem_RESIZE`, :cfunc:`PyMem_DEL`.
|
||||
|
||||
|
||||
.. _memoryexamples:
|
||||
|
||||
Examples
|
||||
========
|
||||
|
||||
Here is the example from section :ref:`memoryoverview`, rewritten so that the
|
||||
I/O buffer is allocated from the Python heap by using the first function set::
|
||||
|
||||
PyObject *res;
|
||||
char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */
|
||||
|
||||
if (buf == NULL)
|
||||
return PyErr_NoMemory();
|
||||
/* ...Do some I/O operation involving buf... */
|
||||
res = PyString_FromString(buf);
|
||||
PyMem_Free(buf); /* allocated with PyMem_Malloc */
|
||||
return res;
|
||||
|
||||
The same code using the type-oriented function set::
|
||||
|
||||
PyObject *res;
|
||||
char *buf = PyMem_New(char, BUFSIZ); /* for I/O */
|
||||
|
||||
if (buf == NULL)
|
||||
return PyErr_NoMemory();
|
||||
/* ...Do some I/O operation involving buf... */
|
||||
res = PyString_FromString(buf);
|
||||
PyMem_Del(buf); /* allocated with PyMem_New */
|
||||
return res;
|
||||
|
||||
Note that in the two examples above, the buffer is always manipulated via
|
||||
functions belonging to the same set. Indeed, it is required to use the same
|
||||
memory API family for a given memory block, so that the risk of mixing different
|
||||
allocators is reduced to a minimum. The following code sequence contains two
|
||||
errors, one of which is labeled as *fatal* because it mixes two different
|
||||
allocators operating on different heaps. ::
|
||||
|
||||
char *buf1 = PyMem_New(char, BUFSIZ);
|
||||
char *buf2 = (char *) malloc(BUFSIZ);
|
||||
char *buf3 = (char *) PyMem_Malloc(BUFSIZ);
|
||||
...
|
||||
PyMem_Del(buf3); /* Wrong -- should be PyMem_Free() */
|
||||
free(buf2); /* Right -- allocated via malloc() */
|
||||
free(buf1); /* Fatal -- should be PyMem_Del() */
|
||||
|
||||
In addition to the functions aimed at handling raw memory blocks from the Python
|
||||
heap, objects in Python are allocated and released with :cfunc:`PyObject_New`,
|
||||
:cfunc:`PyObject_NewVar` and :cfunc:`PyObject_Del`.
|
||||
|
||||
These will be explained in the next chapter on defining and implementing new
|
||||
object types in C.
|
||||
|
||||
1741
Doc-26/c-api/newtypes.rst
Normal file
1741
Doc-26/c-api/newtypes.rst
Normal file
File diff suppressed because it is too large
Load Diff
74
Doc-26/c-api/refcounting.rst
Normal file
74
Doc-26/c-api/refcounting.rst
Normal file
@@ -0,0 +1,74 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
|
||||
.. _countingrefs:
|
||||
|
||||
******************
|
||||
Reference Counting
|
||||
******************
|
||||
|
||||
The macros in this section are used for managing reference counts of Python
|
||||
objects.
|
||||
|
||||
|
||||
.. cfunction:: void Py_INCREF(PyObject *o)
|
||||
|
||||
Increment the reference count for object *o*. The object must not be *NULL*; if
|
||||
you aren't sure that it isn't *NULL*, use :cfunc:`Py_XINCREF`.
|
||||
|
||||
|
||||
.. cfunction:: void Py_XINCREF(PyObject *o)
|
||||
|
||||
Increment the reference count for object *o*. The object may be *NULL*, in
|
||||
which case the macro has no effect.
|
||||
|
||||
|
||||
.. cfunction:: void Py_DECREF(PyObject *o)
|
||||
|
||||
Decrement the reference count for object *o*. The object must not be *NULL*; if
|
||||
you aren't sure that it isn't *NULL*, use :cfunc:`Py_XDECREF`. If the reference
|
||||
count reaches zero, the object's type's deallocation function (which must not be
|
||||
*NULL*) is invoked.
|
||||
|
||||
.. warning::
|
||||
|
||||
The deallocation function can cause arbitrary Python code to be invoked (e.g.
|
||||
when a class instance with a :meth:`__del__` method is deallocated). While
|
||||
exceptions in such code are not propagated, the executed code has free access to
|
||||
all Python global variables. This means that any object that is reachable from
|
||||
a global variable should be in a consistent state before :cfunc:`Py_DECREF` is
|
||||
invoked. For example, code to delete an object from a list should copy a
|
||||
reference to the deleted object in a temporary variable, update the list data
|
||||
structure, and then call :cfunc:`Py_DECREF` for the temporary variable.
|
||||
|
||||
|
||||
.. cfunction:: void Py_XDECREF(PyObject *o)
|
||||
|
||||
Decrement the reference count for object *o*. The object may be *NULL*, in
|
||||
which case the macro has no effect; otherwise the effect is the same as for
|
||||
:cfunc:`Py_DECREF`, and the same warning applies.
|
||||
|
||||
|
||||
.. cfunction:: void Py_CLEAR(PyObject *o)
|
||||
|
||||
Decrement the reference count for object *o*. The object may be *NULL*, in
|
||||
which case the macro has no effect; otherwise the effect is the same as for
|
||||
:cfunc:`Py_DECREF`, except that the argument is also set to *NULL*. The warning
|
||||
for :cfunc:`Py_DECREF` does not apply with respect to the object passed because
|
||||
the macro carefully uses a temporary variable and sets the argument to *NULL*
|
||||
before decrementing its reference count.
|
||||
|
||||
It is a good idea to use this macro whenever decrementing the value of a
|
||||
variable that might be traversed during garbage collection.
|
||||
|
||||
.. versionadded:: 2.4
|
||||
|
||||
The following functions are for runtime dynamic embedding of Python:
|
||||
:cfunc:`Py_IncRef(PyObject \*o)`, :cfunc:`Py_DecRef(PyObject \*o)`. They are
|
||||
simply exported function versions of :cfunc:`Py_XINCREF` and
|
||||
:cfunc:`Py_XDECREF`, respectively.
|
||||
|
||||
The following functions or macros are only for use within the interpreter core:
|
||||
:cfunc:`_Py_Dealloc`, :cfunc:`_Py_ForgetReference`, :cfunc:`_Py_NewReference`,
|
||||
as well as the global variable :cdata:`_Py_RefTotal`.
|
||||
|
||||
1016
Doc-26/c-api/utilities.rst
Normal file
1016
Doc-26/c-api/utilities.rst
Normal file
File diff suppressed because it is too large
Load Diff
278
Doc-26/c-api/veryhigh.rst
Normal file
278
Doc-26/c-api/veryhigh.rst
Normal file
@@ -0,0 +1,278 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
|
||||
.. _veryhigh:
|
||||
|
||||
*************************
|
||||
The Very High Level Layer
|
||||
*************************
|
||||
|
||||
The functions in this chapter will let you execute Python source code given in a
|
||||
file or a buffer, but they will not let you interact in a more detailed way with
|
||||
the interpreter.
|
||||
|
||||
Several of these functions accept a start symbol from the grammar as a
|
||||
parameter. The available start symbols are :const:`Py_eval_input`,
|
||||
:const:`Py_file_input`, and :const:`Py_single_input`. These are described
|
||||
following the functions which accept them as parameters.
|
||||
|
||||
Note also that several of these functions take :ctype:`FILE\*` parameters. On
|
||||
particular issue which needs to be handled carefully is that the :ctype:`FILE`
|
||||
structure for different C libraries can be different and incompatible. Under
|
||||
Windows (at least), it is possible for dynamically linked extensions to actually
|
||||
use different libraries, so care should be taken that :ctype:`FILE\*` parameters
|
||||
are only passed to these functions if it is certain that they were created by
|
||||
the same library that the Python runtime is using.
|
||||
|
||||
|
||||
.. cfunction:: int Py_Main(int argc, char **argv)
|
||||
|
||||
The main program for the standard interpreter. This is made available for
|
||||
programs which embed Python. The *argc* and *argv* parameters should be
|
||||
prepared exactly as those which are passed to a C program's :cfunc:`main`
|
||||
function. It is important to note that the argument list may be modified (but
|
||||
the contents of the strings pointed to by the argument list are not). The return
|
||||
value will be the integer passed to the :func:`sys.exit` function, ``1`` if the
|
||||
interpreter exits due to an exception, or ``2`` if the parameter list does not
|
||||
represent a valid Python command line.
|
||||
|
||||
|
||||
.. cfunction:: int PyRun_AnyFile(FILE *fp, const char *filename)
|
||||
|
||||
This is a simplified interface to :cfunc:`PyRun_AnyFileExFlags` below, leaving
|
||||
*closeit* set to ``0`` and *flags* set to *NULL*.
|
||||
|
||||
|
||||
.. cfunction:: int PyRun_AnyFileFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
|
||||
|
||||
This is a simplified interface to :cfunc:`PyRun_AnyFileExFlags` below, leaving
|
||||
the *closeit* argument set to ``0``.
|
||||
|
||||
|
||||
.. cfunction:: int PyRun_AnyFileEx(FILE *fp, const char *filename, int closeit)
|
||||
|
||||
This is a simplified interface to :cfunc:`PyRun_AnyFileExFlags` below, leaving
|
||||
the *flags* argument set to *NULL*.
|
||||
|
||||
|
||||
.. cfunction:: int PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit, PyCompilerFlags *flags)
|
||||
|
||||
If *fp* refers to a file associated with an interactive device (console or
|
||||
terminal input or Unix pseudo-terminal), return the value of
|
||||
:cfunc:`PyRun_InteractiveLoop`, otherwise return the result of
|
||||
:cfunc:`PyRun_SimpleFile`. If *filename* is *NULL*, this function uses
|
||||
``"???"`` as the filename.
|
||||
|
||||
|
||||
.. cfunction:: int PyRun_SimpleString(const char *command)
|
||||
|
||||
This is a simplified interface to :cfunc:`PyRun_SimpleStringFlags` below,
|
||||
leaving the *PyCompilerFlags\** argument set to NULL.
|
||||
|
||||
|
||||
.. cfunction:: int PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)
|
||||
|
||||
Executes the Python source code from *command* in the :mod:`__main__` module
|
||||
according to the *flags* argument. If :mod:`__main__` does not already exist, it
|
||||
is created. Returns ``0`` on success or ``-1`` if an exception was raised. If
|
||||
there was an error, there is no way to get the exception information. For the
|
||||
meaning of *flags*, see below.
|
||||
|
||||
|
||||
.. cfunction:: int PyRun_SimpleFile(FILE *fp, const char *filename)
|
||||
|
||||
This is a simplified interface to :cfunc:`PyRun_SimpleFileExFlags` below,
|
||||
leaving *closeit* set to ``0`` and *flags* set to *NULL*.
|
||||
|
||||
|
||||
.. cfunction:: int PyRun_SimpleFileFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
|
||||
|
||||
This is a simplified interface to :cfunc:`PyRun_SimpleFileExFlags` below,
|
||||
leaving *closeit* set to ``0``.
|
||||
|
||||
|
||||
.. cfunction:: int PyRun_SimpleFileEx(FILE *fp, const char *filename, int closeit)
|
||||
|
||||
This is a simplified interface to :cfunc:`PyRun_SimpleFileExFlags` below,
|
||||
leaving *flags* set to *NULL*.
|
||||
|
||||
|
||||
.. cfunction:: int PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, PyCompilerFlags *flags)
|
||||
|
||||
Similar to :cfunc:`PyRun_SimpleStringFlags`, but the Python source code is read
|
||||
from *fp* instead of an in-memory string. *filename* should be the name of the
|
||||
file. If *closeit* is true, the file is closed before PyRun_SimpleFileExFlags
|
||||
returns.
|
||||
|
||||
|
||||
.. cfunction:: int PyRun_InteractiveOne(FILE *fp, const char *filename)
|
||||
|
||||
This is a simplified interface to :cfunc:`PyRun_InteractiveOneFlags` below,
|
||||
leaving *flags* set to *NULL*.
|
||||
|
||||
|
||||
.. cfunction:: int PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
|
||||
|
||||
Read and execute a single statement from a file associated with an interactive
|
||||
device according to the *flags* argument. If *filename* is *NULL*, ``"???"`` is
|
||||
used instead. The user will be prompted using ``sys.ps1`` and ``sys.ps2``.
|
||||
Returns ``0`` when the input was executed successfully, ``-1`` if there was an
|
||||
exception, or an error code from the :file:`errcode.h` include file distributed
|
||||
as part of Python if there was a parse error. (Note that :file:`errcode.h` is
|
||||
not included by :file:`Python.h`, so must be included specifically if needed.)
|
||||
|
||||
|
||||
.. cfunction:: int PyRun_InteractiveLoop(FILE *fp, const char *filename)
|
||||
|
||||
This is a simplified interface to :cfunc:`PyRun_InteractiveLoopFlags` below,
|
||||
leaving *flags* set to *NULL*.
|
||||
|
||||
|
||||
.. cfunction:: int PyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
|
||||
|
||||
Read and execute statements from a file associated with an interactive device
|
||||
until EOF is reached. If *filename* is *NULL*, ``"???"`` is used instead. The
|
||||
user will be prompted using ``sys.ps1`` and ``sys.ps2``. Returns ``0`` at EOF.
|
||||
|
||||
|
||||
.. cfunction:: struct _node* PyParser_SimpleParseString(const char *str, int start)
|
||||
|
||||
This is a simplified interface to
|
||||
:cfunc:`PyParser_SimpleParseStringFlagsFilename` below, leaving *filename* set
|
||||
to *NULL* and *flags* set to ``0``.
|
||||
|
||||
|
||||
.. cfunction:: struct _node* PyParser_SimpleParseStringFlags( const char *str, int start, int flags)
|
||||
|
||||
This is a simplified interface to
|
||||
:cfunc:`PyParser_SimpleParseStringFlagsFilename` below, leaving *filename* set
|
||||
to *NULL*.
|
||||
|
||||
|
||||
.. cfunction:: struct _node* PyParser_SimpleParseStringFlagsFilename( const char *str, const char *filename, int start, int flags)
|
||||
|
||||
Parse Python source code from *str* using the start token *start* according to
|
||||
the *flags* argument. The result can be used to create a code object which can
|
||||
be evaluated efficiently. This is useful if a code fragment must be evaluated
|
||||
many times.
|
||||
|
||||
|
||||
.. cfunction:: struct _node* PyParser_SimpleParseFile(FILE *fp, const char *filename, int start)
|
||||
|
||||
This is a simplified interface to :cfunc:`PyParser_SimpleParseFileFlags` below,
|
||||
leaving *flags* set to ``0``
|
||||
|
||||
|
||||
.. cfunction:: struct _node* PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags)
|
||||
|
||||
Similar to :cfunc:`PyParser_SimpleParseStringFlagsFilename`, but the Python
|
||||
source code is read from *fp* instead of an in-memory string.
|
||||
|
||||
|
||||
.. cfunction:: PyObject* PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals)
|
||||
|
||||
This is a simplified interface to :cfunc:`PyRun_StringFlags` below, leaving
|
||||
*flags* set to *NULL*.
|
||||
|
||||
|
||||
.. cfunction:: PyObject* PyRun_StringFlags(const char *str, int start, PyObject *globals, PyObject *locals, PyCompilerFlags *flags)
|
||||
|
||||
Execute Python source code from *str* in the context specified by the
|
||||
dictionaries *globals* and *locals* with the compiler flags specified by
|
||||
*flags*. The parameter *start* specifies the start token that should be used to
|
||||
parse the source code.
|
||||
|
||||
Returns the result of executing the code as a Python object, or *NULL* if an
|
||||
exception was raised.
|
||||
|
||||
|
||||
.. cfunction:: PyObject* PyRun_File(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals)
|
||||
|
||||
This is a simplified interface to :cfunc:`PyRun_FileExFlags` below, leaving
|
||||
*closeit* set to ``0`` and *flags* set to *NULL*.
|
||||
|
||||
|
||||
.. cfunction:: PyObject* PyRun_FileEx(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, int closeit)
|
||||
|
||||
This is a simplified interface to :cfunc:`PyRun_FileExFlags` below, leaving
|
||||
*flags* set to *NULL*.
|
||||
|
||||
|
||||
.. cfunction:: PyObject* PyRun_FileFlags(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, PyCompilerFlags *flags)
|
||||
|
||||
This is a simplified interface to :cfunc:`PyRun_FileExFlags` below, leaving
|
||||
*closeit* set to ``0``.
|
||||
|
||||
|
||||
.. cfunction:: PyObject* PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, int closeit, PyCompilerFlags *flags)
|
||||
|
||||
Similar to :cfunc:`PyRun_StringFlags`, but the Python source code is read from
|
||||
*fp* instead of an in-memory string. *filename* should be the name of the file.
|
||||
If *closeit* is true, the file is closed before :cfunc:`PyRun_FileExFlags`
|
||||
returns.
|
||||
|
||||
|
||||
.. cfunction:: PyObject* Py_CompileString(const char *str, const char *filename, int start)
|
||||
|
||||
This is a simplified interface to :cfunc:`Py_CompileStringFlags` below, leaving
|
||||
*flags* set to *NULL*.
|
||||
|
||||
|
||||
.. cfunction:: PyObject* Py_CompileStringFlags(const char *str, const char *filename, int start, PyCompilerFlags *flags)
|
||||
|
||||
Parse and compile the Python source code in *str*, returning the resulting code
|
||||
object. The start token is given by *start*; this can be used to constrain the
|
||||
code which can be compiled and should be :const:`Py_eval_input`,
|
||||
:const:`Py_file_input`, or :const:`Py_single_input`. The filename specified by
|
||||
*filename* is used to construct the code object and may appear in tracebacks or
|
||||
:exc:`SyntaxError` exception messages. This returns *NULL* if the code cannot
|
||||
be parsed or compiled.
|
||||
|
||||
|
||||
.. cvar:: int Py_eval_input
|
||||
|
||||
.. index:: single: Py_CompileString()
|
||||
|
||||
The start symbol from the Python grammar for isolated expressions; for use with
|
||||
:cfunc:`Py_CompileString`.
|
||||
|
||||
|
||||
.. cvar:: int Py_file_input
|
||||
|
||||
.. index:: single: Py_CompileString()
|
||||
|
||||
The start symbol from the Python grammar for sequences of statements as read
|
||||
from a file or other source; for use with :cfunc:`Py_CompileString`. This is
|
||||
the symbol to use when compiling arbitrarily long Python source code.
|
||||
|
||||
|
||||
.. cvar:: int Py_single_input
|
||||
|
||||
.. index:: single: Py_CompileString()
|
||||
|
||||
The start symbol from the Python grammar for a single statement; for use with
|
||||
:cfunc:`Py_CompileString`. This is the symbol used for the interactive
|
||||
interpreter loop.
|
||||
|
||||
|
||||
.. ctype:: struct PyCompilerFlags
|
||||
|
||||
This is the structure used to hold compiler flags. In cases where code is only
|
||||
being compiled, it is passed as ``int flags``, and in cases where code is being
|
||||
executed, it is passed as ``PyCompilerFlags *flags``. In this case, ``from
|
||||
__future__ import`` can modify *flags*.
|
||||
|
||||
Whenever ``PyCompilerFlags *flags`` is *NULL*, :attr:`cf_flags` is treated as
|
||||
equal to ``0``, and any modification due to ``from __future__ import`` is
|
||||
discarded. ::
|
||||
|
||||
struct PyCompilerFlags {
|
||||
int cf_flags;
|
||||
}
|
||||
|
||||
|
||||
.. cvar:: int CO_FUTURE_DIVISION
|
||||
|
||||
This bit can be set in *flags* to cause division operator ``/`` to be
|
||||
interpreted as "true division" according to :pep:`238`.
|
||||
|
||||
47
Doc-26/conf.py
Normal file
47
Doc-26/conf.py
Normal file
@@ -0,0 +1,47 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Python documentation build configuration file
|
||||
#
|
||||
# The contents of this file are pickled, so don't put values in the namespace
|
||||
# that aren't pickleable (module imports are okay, they're removed automatically).
|
||||
#
|
||||
|
||||
# The default replacements for |version| and |release|.
|
||||
# If 'auto', Sphinx looks for the Include/patchlevel.h file in the current Python
|
||||
# source tree and replaces the values accordingly.
|
||||
#
|
||||
# The short X.Y version.
|
||||
# version = '2.6'
|
||||
version = 'auto'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
# release = '2.6a0'
|
||||
release = 'auto'
|
||||
|
||||
# There are two options for replacing |today|: either, you set today to some
|
||||
# non-false value, then it is used:
|
||||
today = ''
|
||||
# Else, today_fmt is used as the format for a strftime call.
|
||||
today_fmt = '%B %d, %Y'
|
||||
|
||||
# List of files that shouldn't be included in the build.
|
||||
unused_files = [
|
||||
'whatsnew/2.0.rst',
|
||||
'whatsnew/2.1.rst',
|
||||
'whatsnew/2.2.rst',
|
||||
'whatsnew/2.3.rst',
|
||||
'whatsnew/2.4.rst',
|
||||
'whatsnew/2.5.rst',
|
||||
'maclib/scrap.rst',
|
||||
'library/xmllib.rst',
|
||||
]
|
||||
|
||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||
# using the given strftime format.
|
||||
last_updated_format = '%b %d, %Y'
|
||||
|
||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||
# typographically correct entities.
|
||||
use_smartypants = True
|
||||
|
||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||
add_function_parentheses = True
|
||||
21
Doc-26/contents.rst
Normal file
21
Doc-26/contents.rst
Normal file
@@ -0,0 +1,21 @@
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
Python Documentation contents
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
.. toctree::
|
||||
|
||||
whatsnew/2.6.rst
|
||||
tutorial/index.rst
|
||||
reference/index.rst
|
||||
library/index.rst
|
||||
maclib/index.rst
|
||||
extending/index.rst
|
||||
c-api/index.rst
|
||||
distutils/index.rst
|
||||
install/index.rst
|
||||
documenting/index.rst
|
||||
|
||||
bugs.rst
|
||||
about.rst
|
||||
license.rst
|
||||
copyright.rst
|
||||
15
Doc-26/copyright.rst
Normal file
15
Doc-26/copyright.rst
Normal file
@@ -0,0 +1,15 @@
|
||||
*********
|
||||
Copyright
|
||||
*********
|
||||
|
||||
Copyright © 2001-2007 Python Software Foundation. All rights reserved.
|
||||
|
||||
Copyright © 2000 BeOpen.com. All rights reserved.
|
||||
|
||||
Copyright © 1995-2000 Corporation for National Research Initiatives. All rights
|
||||
reserved.
|
||||
|
||||
Copyright © 1991-1995 Stichting Mathematisch Centrum. All rights reserved.
|
||||
|
||||
See the end of this document for complete license and permissions information.
|
||||
|
||||
1756
Doc-26/data/refcounts.dat
Normal file
1756
Doc-26/data/refcounts.dat
Normal file
File diff suppressed because it is too large
Load Diff
1889
Doc-26/distutils/apiref.rst
Normal file
1889
Doc-26/distutils/apiref.rst
Normal file
File diff suppressed because it is too large
Load Diff
405
Doc-26/distutils/builtdist.rst
Normal file
405
Doc-26/distutils/builtdist.rst
Normal file
@@ -0,0 +1,405 @@
|
||||
.. _built-dist:
|
||||
|
||||
****************************
|
||||
Creating Built Distributions
|
||||
****************************
|
||||
|
||||
A "built distribution" is what you're probably used to thinking of either as a
|
||||
"binary package" or an "installer" (depending on your background). It's not
|
||||
necessarily binary, though, because it might contain only Python source code
|
||||
and/or byte-code; and we don't call it a package, because that word is already
|
||||
spoken for in Python. (And "installer" is a term specific to the world of
|
||||
mainstream desktop systems.)
|
||||
|
||||
A built distribution is how you make life as easy as possible for installers of
|
||||
your module distribution: for users of RPM-based Linux systems, it's a binary
|
||||
RPM; for Windows users, it's an executable installer; for Debian-based Linux
|
||||
users, it's a Debian package; and so forth. Obviously, no one person will be
|
||||
able to create built distributions for every platform under the sun, so the
|
||||
Distutils are designed to enable module developers to concentrate on their
|
||||
specialty---writing code and creating source distributions---while an
|
||||
intermediary species called *packagers* springs up to turn source distributions
|
||||
into built distributions for as many platforms as there are packagers.
|
||||
|
||||
Of course, the module developer could be his own packager; or the packager could
|
||||
be a volunteer "out there" somewhere who has access to a platform which the
|
||||
original developer does not; or it could be software periodically grabbing new
|
||||
source distributions and turning them into built distributions for as many
|
||||
platforms as the software has access to. Regardless of who they are, a packager
|
||||
uses the setup script and the :command:`bdist` command family to generate built
|
||||
distributions.
|
||||
|
||||
As a simple example, if I run the following command in the Distutils source
|
||||
tree::
|
||||
|
||||
python setup.py bdist
|
||||
|
||||
then the Distutils builds my module distribution (the Distutils itself in this
|
||||
case), does a "fake" installation (also in the :file:`build` directory), and
|
||||
creates the default type of built distribution for my platform. The default
|
||||
format for built distributions is a "dumb" tar file on Unix, and a simple
|
||||
executable installer on Windows. (That tar file is considered "dumb" because it
|
||||
has to be unpacked in a specific location to work.)
|
||||
|
||||
Thus, the above command on a Unix system creates
|
||||
:file:`Distutils-1.0.{plat}.tar.gz`; unpacking this tarball from the right place
|
||||
installs the Distutils just as though you had downloaded the source distribution
|
||||
and run ``python setup.py install``. (The "right place" is either the root of
|
||||
the filesystem or Python's :file:`{prefix}` directory, depending on the options
|
||||
given to the :command:`bdist_dumb` command; the default is to make dumb
|
||||
distributions relative to :file:`{prefix}`.)
|
||||
|
||||
Obviously, for pure Python distributions, this isn't any simpler than just
|
||||
running ``python setup.py install``\ ---but for non-pure distributions, which
|
||||
include extensions that would need to be compiled, it can mean the difference
|
||||
between someone being able to use your extensions or not. And creating "smart"
|
||||
built distributions, such as an RPM package or an executable installer for
|
||||
Windows, is far more convenient for users even if your distribution doesn't
|
||||
include any extensions.
|
||||
|
||||
The :command:`bdist` command has a :option:`--formats` option, similar to the
|
||||
:command:`sdist` command, which you can use to select the types of built
|
||||
distribution to generate: for example, ::
|
||||
|
||||
python setup.py bdist --format=zip
|
||||
|
||||
would, when run on a Unix system, create :file:`Distutils-1.0.{plat}.zip`\
|
||||
---again, this archive would be unpacked from the root directory to install the
|
||||
Distutils.
|
||||
|
||||
The available formats for built distributions are:
|
||||
|
||||
+-------------+------------------------------+---------+
|
||||
| Format | Description | Notes |
|
||||
+=============+==============================+=========+
|
||||
| ``gztar`` | gzipped tar file | (1),(3) |
|
||||
| | (:file:`.tar.gz`) | |
|
||||
+-------------+------------------------------+---------+
|
||||
| ``ztar`` | compressed tar file | \(3) |
|
||||
| | (:file:`.tar.Z`) | |
|
||||
+-------------+------------------------------+---------+
|
||||
| ``tar`` | tar file (:file:`.tar`) | \(3) |
|
||||
+-------------+------------------------------+---------+
|
||||
| ``zip`` | zip file (:file:`.zip`) | \(4) |
|
||||
+-------------+------------------------------+---------+
|
||||
| ``rpm`` | RPM | \(5) |
|
||||
+-------------+------------------------------+---------+
|
||||
| ``pkgtool`` | Solaris :program:`pkgtool` | |
|
||||
+-------------+------------------------------+---------+
|
||||
| ``sdux`` | HP-UX :program:`swinstall` | |
|
||||
+-------------+------------------------------+---------+
|
||||
| ``rpm`` | RPM | \(5) |
|
||||
+-------------+------------------------------+---------+
|
||||
| ``wininst`` | self-extracting ZIP file for | (2),(4) |
|
||||
| | Windows | |
|
||||
+-------------+------------------------------+---------+
|
||||
|
||||
Notes:
|
||||
|
||||
(1)
|
||||
default on Unix
|
||||
|
||||
(2)
|
||||
default on Windows
|
||||
|
||||
**\*\*** to-do! **\*\***
|
||||
|
||||
(3)
|
||||
requires external utilities: :program:`tar` and possibly one of :program:`gzip`,
|
||||
:program:`bzip2`, or :program:`compress`
|
||||
|
||||
(4)
|
||||
requires either external :program:`zip` utility or :mod:`zipfile` module (part
|
||||
of the standard Python library since Python 1.6)
|
||||
|
||||
(5)
|
||||
requires external :program:`rpm` utility, version 3.0.4 or better (use ``rpm
|
||||
--version`` to find out which version you have)
|
||||
|
||||
You don't have to use the :command:`bdist` command with the :option:`--formats`
|
||||
option; you can also use the command that directly implements the format you're
|
||||
interested in. Some of these :command:`bdist` "sub-commands" actually generate
|
||||
several similar formats; for instance, the :command:`bdist_dumb` command
|
||||
generates all the "dumb" archive formats (``tar``, ``ztar``, ``gztar``, and
|
||||
``zip``), and :command:`bdist_rpm` generates both binary and source RPMs. The
|
||||
:command:`bdist` sub-commands, and the formats generated by each, are:
|
||||
|
||||
+--------------------------+-----------------------+
|
||||
| Command | Formats |
|
||||
+==========================+=======================+
|
||||
| :command:`bdist_dumb` | tar, ztar, gztar, zip |
|
||||
+--------------------------+-----------------------+
|
||||
| :command:`bdist_rpm` | rpm, srpm |
|
||||
+--------------------------+-----------------------+
|
||||
| :command:`bdist_wininst` | wininst |
|
||||
+--------------------------+-----------------------+
|
||||
|
||||
The following sections give details on the individual :command:`bdist_\*`
|
||||
commands.
|
||||
|
||||
|
||||
.. _creating-dumb:
|
||||
|
||||
Creating dumb built distributions
|
||||
=================================
|
||||
|
||||
**\*\*** Need to document absolute vs. prefix-relative packages here, but first
|
||||
I have to implement it! **\*\***
|
||||
|
||||
|
||||
.. _creating-rpms:
|
||||
|
||||
Creating RPM packages
|
||||
=====================
|
||||
|
||||
The RPM format is used by many popular Linux distributions, including Red Hat,
|
||||
SuSE, and Mandrake. If one of these (or any of the other RPM-based Linux
|
||||
distributions) is your usual environment, creating RPM packages for other users
|
||||
of that same distribution is trivial. Depending on the complexity of your module
|
||||
distribution and differences between Linux distributions, you may also be able
|
||||
to create RPMs that work on different RPM-based distributions.
|
||||
|
||||
The usual way to create an RPM of your module distribution is to run the
|
||||
:command:`bdist_rpm` command::
|
||||
|
||||
python setup.py bdist_rpm
|
||||
|
||||
or the :command:`bdist` command with the :option:`--format` option::
|
||||
|
||||
python setup.py bdist --formats=rpm
|
||||
|
||||
The former allows you to specify RPM-specific options; the latter allows you to
|
||||
easily specify multiple formats in one run. If you need to do both, you can
|
||||
explicitly specify multiple :command:`bdist_\*` commands and their options::
|
||||
|
||||
python setup.py bdist_rpm --packager="John Doe <jdoe@example.org>" \
|
||||
bdist_wininst --target_version="2.0"
|
||||
|
||||
Creating RPM packages is driven by a :file:`.spec` file, much as using the
|
||||
Distutils is driven by the setup script. To make your life easier, the
|
||||
:command:`bdist_rpm` command normally creates a :file:`.spec` file based on the
|
||||
information you supply in the setup script, on the command line, and in any
|
||||
Distutils configuration files. Various options and sections in the
|
||||
:file:`.spec` file are derived from options in the setup script as follows:
|
||||
|
||||
+------------------------------------------+----------------------------------------------+
|
||||
| RPM :file:`.spec` file option or section | Distutils setup script option |
|
||||
+==========================================+==============================================+
|
||||
| Name | :option:`name` |
|
||||
+------------------------------------------+----------------------------------------------+
|
||||
| Summary (in preamble) | :option:`description` |
|
||||
+------------------------------------------+----------------------------------------------+
|
||||
| Version | :option:`version` |
|
||||
+------------------------------------------+----------------------------------------------+
|
||||
| Vendor | :option:`author` and :option:`author_email`, |
|
||||
| | or --- & :option:`maintainer` and |
|
||||
| | :option:`maintainer_email` |
|
||||
+------------------------------------------+----------------------------------------------+
|
||||
| Copyright | :option:`licence` |
|
||||
+------------------------------------------+----------------------------------------------+
|
||||
| Url | :option:`url` |
|
||||
+------------------------------------------+----------------------------------------------+
|
||||
| %description (section) | :option:`long_description` |
|
||||
+------------------------------------------+----------------------------------------------+
|
||||
|
||||
Additionally, there are many options in :file:`.spec` files that don't have
|
||||
corresponding options in the setup script. Most of these are handled through
|
||||
options to the :command:`bdist_rpm` command as follows:
|
||||
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
| RPM :file:`.spec` file option | :command:`bdist_rpm` option | default value |
|
||||
| or section | | |
|
||||
+===============================+=============================+=========================+
|
||||
| Release | :option:`release` | "1" |
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
| Group | :option:`group` | "Development/Libraries" |
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
| Vendor | :option:`vendor` | (see above) |
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
| Packager | :option:`packager` | (none) |
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
| Provides | :option:`provides` | (none) |
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
| Requires | :option:`requires` | (none) |
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
| Conflicts | :option:`conflicts` | (none) |
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
| Obsoletes | :option:`obsoletes` | (none) |
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
| Distribution | :option:`distribution_name` | (none) |
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
| BuildRequires | :option:`build_requires` | (none) |
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
| Icon | :option:`icon` | (none) |
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
|
||||
Obviously, supplying even a few of these options on the command-line would be
|
||||
tedious and error-prone, so it's usually best to put them in the setup
|
||||
configuration file, :file:`setup.cfg`\ ---see section :ref:`setup-config`. If
|
||||
you distribute or package many Python module distributions, you might want to
|
||||
put options that apply to all of them in your personal Distutils configuration
|
||||
file (:file:`~/.pydistutils.cfg`).
|
||||
|
||||
There are three steps to building a binary RPM package, all of which are
|
||||
handled automatically by the Distutils:
|
||||
|
||||
#. create a :file:`.spec` file, which describes the package (analogous to the
|
||||
Distutils setup script; in fact, much of the information in the setup script
|
||||
winds up in the :file:`.spec` file)
|
||||
|
||||
#. create the source RPM
|
||||
|
||||
#. create the "binary" RPM (which may or may not contain binary code, depending
|
||||
on whether your module distribution contains Python extensions)
|
||||
|
||||
Normally, RPM bundles the last two steps together; when you use the Distutils,
|
||||
all three steps are typically bundled together.
|
||||
|
||||
If you wish, you can separate these three steps. You can use the
|
||||
:option:`--spec-only` option to make :command:`bdist_rpm` just create the
|
||||
:file:`.spec` file and exit; in this case, the :file:`.spec` file will be
|
||||
written to the "distribution directory"---normally :file:`dist/`, but
|
||||
customizable with the :option:`--dist-dir` option. (Normally, the :file:`.spec`
|
||||
file winds up deep in the "build tree," in a temporary directory created by
|
||||
:command:`bdist_rpm`.)
|
||||
|
||||
.. % \XXX{this isn't implemented yet---is it needed?!}
|
||||
.. % You can also specify a custom \file{.spec} file with the
|
||||
.. % \longprogramopt{spec-file} option; used in conjunction with
|
||||
.. % \longprogramopt{spec-only}, this gives you an opportunity to customize
|
||||
.. % the \file{.spec} file manually:
|
||||
.. %
|
||||
.. % \ begin{verbatim}
|
||||
.. % > python setup.py bdist_rpm --spec-only
|
||||
.. % # ...edit dist/FooBar-1.0.spec
|
||||
.. % > python setup.py bdist_rpm --spec-file=dist/FooBar-1.0.spec
|
||||
.. % \ end{verbatim}
|
||||
.. %
|
||||
.. % (Although a better way to do this is probably to override the standard
|
||||
.. % \command{bdist\_rpm} command with one that writes whatever else you want
|
||||
.. % to the \file{.spec} file.)
|
||||
|
||||
|
||||
.. _creating-wininst:
|
||||
|
||||
Creating Windows Installers
|
||||
===========================
|
||||
|
||||
Executable installers are the natural format for binary distributions on
|
||||
Windows. They display a nice graphical user interface, display some information
|
||||
about the module distribution to be installed taken from the metadata in the
|
||||
setup script, let the user select a few options, and start or cancel the
|
||||
installation.
|
||||
|
||||
Since the metadata is taken from the setup script, creating Windows installers
|
||||
is usually as easy as running::
|
||||
|
||||
python setup.py bdist_wininst
|
||||
|
||||
or the :command:`bdist` command with the :option:`--formats` option::
|
||||
|
||||
python setup.py bdist --formats=wininst
|
||||
|
||||
If you have a pure module distribution (only containing pure Python modules and
|
||||
packages), the resulting installer will be version independent and have a name
|
||||
like :file:`foo-1.0.win32.exe`. These installers can even be created on Unix or
|
||||
Mac OS platforms.
|
||||
|
||||
If you have a non-pure distribution, the extensions can only be created on a
|
||||
Windows platform, and will be Python version dependent. The installer filename
|
||||
will reflect this and now has the form :file:`foo-1.0.win32-py2.0.exe`. You
|
||||
have to create a separate installer for every Python version you want to
|
||||
support.
|
||||
|
||||
The installer will try to compile pure modules into bytecode after installation
|
||||
on the target system in normal and optimizing mode. If you don't want this to
|
||||
happen for some reason, you can run the :command:`bdist_wininst` command with
|
||||
the :option:`--no-target-compile` and/or the :option:`--no-target-optimize`
|
||||
option.
|
||||
|
||||
By default the installer will display the cool "Python Powered" logo when it is
|
||||
run, but you can also supply your own bitmap which must be a Windows
|
||||
:file:`.bmp` file with the :option:`--bitmap` option.
|
||||
|
||||
The installer will also display a large title on the desktop background window
|
||||
when it is run, which is constructed from the name of your distribution and the
|
||||
version number. This can be changed to another text by using the
|
||||
:option:`--title` option.
|
||||
|
||||
The installer file will be written to the "distribution directory" --- normally
|
||||
:file:`dist/`, but customizable with the :option:`--dist-dir` option.
|
||||
|
||||
|
||||
.. _postinstallation-script:
|
||||
|
||||
The Postinstallation script
|
||||
---------------------------
|
||||
|
||||
Starting with Python 2.3, a postinstallation script can be specified which the
|
||||
:option:`--install-script` option. The basename of the script must be
|
||||
specified, and the script filename must also be listed in the scripts argument
|
||||
to the setup function.
|
||||
|
||||
This script will be run at installation time on the target system after all the
|
||||
files have been copied, with ``argv[1]`` set to :option:`-install`, and again at
|
||||
uninstallation time before the files are removed with ``argv[1]`` set to
|
||||
:option:`-remove`.
|
||||
|
||||
The installation script runs embedded in the windows installer, every output
|
||||
(``sys.stdout``, ``sys.stderr``) is redirected into a buffer and will be
|
||||
displayed in the GUI after the script has finished.
|
||||
|
||||
Some functions especially useful in this context are available as additional
|
||||
built-in functions in the installation script.
|
||||
|
||||
|
||||
.. function:: directory_created(path)
|
||||
file_created(path)
|
||||
|
||||
These functions should be called when a directory or file is created by the
|
||||
postinstall script at installation time. It will register *path* with the
|
||||
uninstaller, so that it will be removed when the distribution is uninstalled.
|
||||
To be safe, directories are only removed if they are empty.
|
||||
|
||||
|
||||
.. function:: get_special_folder_path(csidl_string)
|
||||
|
||||
This function can be used to retrieve special folder locations on Windows like
|
||||
the Start Menu or the Desktop. It returns the full path to the folder.
|
||||
*csidl_string* must be one of the following strings::
|
||||
|
||||
"CSIDL_APPDATA"
|
||||
|
||||
"CSIDL_COMMON_STARTMENU"
|
||||
"CSIDL_STARTMENU"
|
||||
|
||||
"CSIDL_COMMON_DESKTOPDIRECTORY"
|
||||
"CSIDL_DESKTOPDIRECTORY"
|
||||
|
||||
"CSIDL_COMMON_STARTUP"
|
||||
"CSIDL_STARTUP"
|
||||
|
||||
"CSIDL_COMMON_PROGRAMS"
|
||||
"CSIDL_PROGRAMS"
|
||||
|
||||
"CSIDL_FONTS"
|
||||
|
||||
If the folder cannot be retrieved, :exc:`OSError` is raised.
|
||||
|
||||
Which folders are available depends on the exact Windows version, and probably
|
||||
also the configuration. For details refer to Microsoft's documentation of the
|
||||
:cfunc:`SHGetSpecialFolderPath` function.
|
||||
|
||||
|
||||
.. function:: create_shortcut(target, description, filename[, arguments[, workdir[, iconpath[, iconindex]]]])
|
||||
|
||||
This function creates a shortcut. *target* is the path to the program to be
|
||||
started by the shortcut. *description* is the description of the shortcut.
|
||||
*filename* is the title of the shortcut that the user will see. *arguments*
|
||||
specifies the command line arguments, if any. *workdir* is the working directory
|
||||
for the program. *iconpath* is the file containing the icon for the shortcut,
|
||||
and *iconindex* is the index of the icon in the file *iconpath*. Again, for
|
||||
details consult the Microsoft documentation for the :class:`IShellLink`
|
||||
interface.
|
||||
|
||||
|
||||
104
Doc-26/distutils/commandref.rst
Normal file
104
Doc-26/distutils/commandref.rst
Normal file
@@ -0,0 +1,104 @@
|
||||
.. _reference:
|
||||
|
||||
*****************
|
||||
Command Reference
|
||||
*****************
|
||||
|
||||
.. % \section{Building modules: the \protect\command{build} command family}
|
||||
.. % \label{build-cmds}
|
||||
.. % \subsubsection{\protect\command{build}}
|
||||
.. % \label{build-cmd}
|
||||
.. % \subsubsection{\protect\command{build\_py}}
|
||||
.. % \label{build-py-cmd}
|
||||
.. % \subsubsection{\protect\command{build\_ext}}
|
||||
.. % \label{build-ext-cmd}
|
||||
.. % \subsubsection{\protect\command{build\_clib}}
|
||||
.. % \label{build-clib-cmd}
|
||||
|
||||
|
||||
.. _install-cmd:
|
||||
|
||||
Installing modules: the :command:`install` command family
|
||||
=========================================================
|
||||
|
||||
The install command ensures that the build commands have been run and then runs
|
||||
the subcommands :command:`install_lib`, :command:`install_data` and
|
||||
:command:`install_scripts`.
|
||||
|
||||
.. % \subsubsection{\protect\command{install\_lib}}
|
||||
.. % \label{install-lib-cmd}
|
||||
|
||||
|
||||
.. _install-data-cmd:
|
||||
|
||||
:command:`install_data`
|
||||
-----------------------
|
||||
|
||||
This command installs all data files provided with the distribution.
|
||||
|
||||
|
||||
.. _install-scripts-cmd:
|
||||
|
||||
:command:`install_scripts`
|
||||
--------------------------
|
||||
|
||||
This command installs all (Python) scripts in the distribution.
|
||||
|
||||
.. % \subsection{Cleaning up: the \protect\command{clean} command}
|
||||
.. % \label{clean-cmd}
|
||||
|
||||
|
||||
.. _sdist-cmd:
|
||||
|
||||
Creating a source distribution: the :command:`sdist` command
|
||||
============================================================
|
||||
|
||||
**\*\*** fragment moved down from above: needs context! **\*\***
|
||||
|
||||
The manifest template commands are:
|
||||
|
||||
+-------------------------------------------+-----------------------------------------------+
|
||||
| Command | Description |
|
||||
+===========================================+===============================================+
|
||||
| :command:`include pat1 pat2 ...` | include all files matching any of the listed |
|
||||
| | patterns |
|
||||
+-------------------------------------------+-----------------------------------------------+
|
||||
| :command:`exclude pat1 pat2 ...` | exclude all files matching any of the listed |
|
||||
| | patterns |
|
||||
+-------------------------------------------+-----------------------------------------------+
|
||||
| :command:`recursive-include dir pat1 pat2 | include all files under *dir* matching any of |
|
||||
| ...` | the listed patterns |
|
||||
+-------------------------------------------+-----------------------------------------------+
|
||||
| :command:`recursive-exclude dir pat1 pat2 | exclude all files under *dir* matching any of |
|
||||
| ...` | the listed patterns |
|
||||
+-------------------------------------------+-----------------------------------------------+
|
||||
| :command:`global-include pat1 pat2 ...` | include all files anywhere in the source tree |
|
||||
| | matching --- & any of the listed patterns |
|
||||
+-------------------------------------------+-----------------------------------------------+
|
||||
| :command:`global-exclude pat1 pat2 ...` | exclude all files anywhere in the source tree |
|
||||
| | matching --- & any of the listed patterns |
|
||||
+-------------------------------------------+-----------------------------------------------+
|
||||
| :command:`prune dir` | exclude all files under *dir* |
|
||||
+-------------------------------------------+-----------------------------------------------+
|
||||
| :command:`graft dir` | include all files under *dir* |
|
||||
+-------------------------------------------+-----------------------------------------------+
|
||||
|
||||
The patterns here are Unix-style "glob" patterns: ``*`` matches any sequence of
|
||||
regular filename characters, ``?`` matches any single regular filename
|
||||
character, and ``[range]`` matches any of the characters in *range* (e.g.,
|
||||
``a-z``, ``a-zA-Z``, ``a-f0-9_.``). The definition of "regular filename
|
||||
character" is platform-specific: on Unix it is anything except slash; on Windows
|
||||
anything except backslash or colon; on Mac OS 9 anything except colon.
|
||||
|
||||
**\*\*** Windows support not there yet **\*\***
|
||||
|
||||
.. % \section{Creating a built distribution: the
|
||||
.. % \protect\command{bdist} command family}
|
||||
.. % \label{bdist-cmds}
|
||||
|
||||
.. % \subsection{\protect\command{bdist}}
|
||||
.. % \subsection{\protect\command{bdist\_dumb}}
|
||||
.. % \subsection{\protect\command{bdist\_rpm}}
|
||||
.. % \subsection{\protect\command{bdist\_wininst}}
|
||||
|
||||
|
||||
130
Doc-26/distutils/configfile.rst
Normal file
130
Doc-26/distutils/configfile.rst
Normal file
@@ -0,0 +1,130 @@
|
||||
.. _setup-config:
|
||||
|
||||
************************************
|
||||
Writing the Setup Configuration File
|
||||
************************************
|
||||
|
||||
Often, it's not possible to write down everything needed to build a distribution
|
||||
*a priori*: you may need to get some information from the user, or from the
|
||||
user's system, in order to proceed. As long as that information is fairly
|
||||
simple---a list of directories to search for C header files or libraries, for
|
||||
example---then providing a configuration file, :file:`setup.cfg`, for users to
|
||||
edit is a cheap and easy way to solicit it. Configuration files also let you
|
||||
provide default values for any command option, which the installer can then
|
||||
override either on the command-line or by editing the config file.
|
||||
|
||||
The setup configuration file is a useful middle-ground between the setup script
|
||||
---which, ideally, would be opaque to installers [#]_---and the command-line to
|
||||
the setup script, which is outside of your control and entirely up to the
|
||||
installer. In fact, :file:`setup.cfg` (and any other Distutils configuration
|
||||
files present on the target system) are processed after the contents of the
|
||||
setup script, but before the command-line. This has several useful
|
||||
consequences:
|
||||
|
||||
.. % (If you have more advanced needs, such as determining which extensions
|
||||
.. % to build based on what capabilities are present on the target system,
|
||||
.. % then you need the Distutils ``auto-configuration'' facility. This
|
||||
.. % started to appear in Distutils 0.9 but, as of this writing, isn't mature
|
||||
.. % or stable enough yet for real-world use.)
|
||||
|
||||
* installers can override some of what you put in :file:`setup.py` by editing
|
||||
:file:`setup.cfg`
|
||||
|
||||
* you can provide non-standard defaults for options that are not easily set in
|
||||
:file:`setup.py`
|
||||
|
||||
* installers can override anything in :file:`setup.cfg` using the command-line
|
||||
options to :file:`setup.py`
|
||||
|
||||
The basic syntax of the configuration file is simple::
|
||||
|
||||
[command]
|
||||
option=value
|
||||
...
|
||||
|
||||
where *command* is one of the Distutils commands (e.g. :command:`build_py`,
|
||||
:command:`install`), and *option* is one of the options that command supports.
|
||||
Any number of options can be supplied for each command, and any number of
|
||||
command sections can be included in the file. Blank lines are ignored, as are
|
||||
comments, which run from a ``'#'`` character until the end of the line. Long
|
||||
option values can be split across multiple lines simply by indenting the
|
||||
continuation lines.
|
||||
|
||||
You can find out the list of options supported by a particular command with the
|
||||
universal :option:`--help` option, e.g. ::
|
||||
|
||||
> python setup.py --help build_ext
|
||||
[...]
|
||||
Options for 'build_ext' command:
|
||||
--build-lib (-b) directory for compiled extension modules
|
||||
--build-temp (-t) directory for temporary files (build by-products)
|
||||
--inplace (-i) ignore build-lib and put compiled extensions into the
|
||||
source directory alongside your pure Python modules
|
||||
--include-dirs (-I) list of directories to search for header files
|
||||
--define (-D) C preprocessor macros to define
|
||||
--undef (-U) C preprocessor macros to undefine
|
||||
--swig-opts list of SWIG command line options
|
||||
[...]
|
||||
|
||||
Note that an option spelled :option:`--foo-bar` on the command-line is spelled
|
||||
:option:`foo_bar` in configuration files.
|
||||
|
||||
For example, say you want your extensions to be built "in-place"---that is, you
|
||||
have an extension :mod:`pkg.ext`, and you want the compiled extension file
|
||||
(:file:`ext.so` on Unix, say) to be put in the same source directory as your
|
||||
pure Python modules :mod:`pkg.mod1` and :mod:`pkg.mod2`. You can always use the
|
||||
:option:`--inplace` option on the command-line to ensure this::
|
||||
|
||||
python setup.py build_ext --inplace
|
||||
|
||||
But this requires that you always specify the :command:`build_ext` command
|
||||
explicitly, and remember to provide :option:`--inplace`. An easier way is to
|
||||
"set and forget" this option, by encoding it in :file:`setup.cfg`, the
|
||||
configuration file for this distribution::
|
||||
|
||||
[build_ext]
|
||||
inplace=1
|
||||
|
||||
This will affect all builds of this module distribution, whether or not you
|
||||
explicitly specify :command:`build_ext`. If you include :file:`setup.cfg` in
|
||||
your source distribution, it will also affect end-user builds---which is
|
||||
probably a bad idea for this option, since always building extensions in-place
|
||||
would break installation of the module distribution. In certain peculiar cases,
|
||||
though, modules are built right in their installation directory, so this is
|
||||
conceivably a useful ability. (Distributing extensions that expect to be built
|
||||
in their installation directory is almost always a bad idea, though.)
|
||||
|
||||
Another example: certain commands take a lot of options that don't change from
|
||||
run to run; for example, :command:`bdist_rpm` needs to know everything required
|
||||
to generate a "spec" file for creating an RPM distribution. Some of this
|
||||
information comes from the setup script, and some is automatically generated by
|
||||
the Distutils (such as the list of files installed). But some of it has to be
|
||||
supplied as options to :command:`bdist_rpm`, which would be very tedious to do
|
||||
on the command-line for every run. Hence, here is a snippet from the Distutils'
|
||||
own :file:`setup.cfg`::
|
||||
|
||||
[bdist_rpm]
|
||||
release = 1
|
||||
packager = Greg Ward <gward@python.net>
|
||||
doc_files = CHANGES.txt
|
||||
README.txt
|
||||
USAGE.txt
|
||||
doc/
|
||||
examples/
|
||||
|
||||
Note that the :option:`doc_files` option is simply a whitespace-separated string
|
||||
split across multiple lines for readability.
|
||||
|
||||
|
||||
.. seealso::
|
||||
|
||||
`Installing Python Modules <../inst/config-syntax.html>`_
|
||||
More information on the configuration files is available in the manual for
|
||||
system administrators.
|
||||
|
||||
|
||||
.. rubric:: Footnotes
|
||||
|
||||
.. [#] This ideal probably won't be achieved until auto-configuration is fully
|
||||
supported by the Distutils.
|
||||
|
||||
241
Doc-26/distutils/examples.rst
Normal file
241
Doc-26/distutils/examples.rst
Normal file
@@ -0,0 +1,241 @@
|
||||
.. _examples:
|
||||
|
||||
********
|
||||
Examples
|
||||
********
|
||||
|
||||
This chapter provides a number of basic examples to help get started with
|
||||
distutils. Additional information about using distutils can be found in the
|
||||
Distutils Cookbook.
|
||||
|
||||
|
||||
.. seealso::
|
||||
|
||||
`Distutils Cookbook <http://www.python.org/cgi-bin/moinmoin/DistutilsCookbook>`_
|
||||
Collection of recipes showing how to achieve more control over distutils.
|
||||
|
||||
|
||||
.. _pure-mod:
|
||||
|
||||
Pure Python distribution (by module)
|
||||
====================================
|
||||
|
||||
If you're just distributing a couple of modules, especially if they don't live
|
||||
in a particular package, you can specify them individually using the
|
||||
:option:`py_modules` option in the setup script.
|
||||
|
||||
In the simplest case, you'll have two files to worry about: a setup script and
|
||||
the single module you're distributing, :file:`foo.py` in this example::
|
||||
|
||||
<root>/
|
||||
setup.py
|
||||
foo.py
|
||||
|
||||
(In all diagrams in this section, *<root>* will refer to the distribution root
|
||||
directory.) A minimal setup script to describe this situation would be::
|
||||
|
||||
from distutils.core import setup
|
||||
setup(name='foo',
|
||||
version='1.0',
|
||||
py_modules=['foo'],
|
||||
)
|
||||
|
||||
Note that the name of the distribution is specified independently with the
|
||||
:option:`name` option, and there's no rule that says it has to be the same as
|
||||
the name of the sole module in the distribution (although that's probably a good
|
||||
convention to follow). However, the distribution name is used to generate
|
||||
filenames, so you should stick to letters, digits, underscores, and hyphens.
|
||||
|
||||
Since :option:`py_modules` is a list, you can of course specify multiple
|
||||
modules, eg. if you're distributing modules :mod:`foo` and :mod:`bar`, your
|
||||
setup might look like this::
|
||||
|
||||
<root>/
|
||||
setup.py
|
||||
foo.py
|
||||
bar.py
|
||||
|
||||
and the setup script might be ::
|
||||
|
||||
from distutils.core import setup
|
||||
setup(name='foobar',
|
||||
version='1.0',
|
||||
py_modules=['foo', 'bar'],
|
||||
)
|
||||
|
||||
You can put module source files into another directory, but if you have enough
|
||||
modules to do that, it's probably easier to specify modules by package rather
|
||||
than listing them individually.
|
||||
|
||||
|
||||
.. _pure-pkg:
|
||||
|
||||
Pure Python distribution (by package)
|
||||
=====================================
|
||||
|
||||
If you have more than a couple of modules to distribute, especially if they are
|
||||
in multiple packages, it's probably easier to specify whole packages rather than
|
||||
individual modules. This works even if your modules are not in a package; you
|
||||
can just tell the Distutils to process modules from the root package, and that
|
||||
works the same as any other package (except that you don't have to have an
|
||||
:file:`__init__.py` file).
|
||||
|
||||
The setup script from the last example could also be written as ::
|
||||
|
||||
from distutils.core import setup
|
||||
setup(name='foobar',
|
||||
version='1.0',
|
||||
packages=[''],
|
||||
)
|
||||
|
||||
(The empty string stands for the root package.)
|
||||
|
||||
If those two files are moved into a subdirectory, but remain in the root
|
||||
package, e.g.::
|
||||
|
||||
<root>/
|
||||
setup.py
|
||||
src/ foo.py
|
||||
bar.py
|
||||
|
||||
then you would still specify the root package, but you have to tell the
|
||||
Distutils where source files in the root package live::
|
||||
|
||||
from distutils.core import setup
|
||||
setup(name='foobar',
|
||||
version='1.0',
|
||||
package_dir={'': 'src'},
|
||||
packages=[''],
|
||||
)
|
||||
|
||||
More typically, though, you will want to distribute multiple modules in the same
|
||||
package (or in sub-packages). For example, if the :mod:`foo` and :mod:`bar`
|
||||
modules belong in package :mod:`foobar`, one way to layout your source tree is
|
||||
::
|
||||
|
||||
<root>/
|
||||
setup.py
|
||||
foobar/
|
||||
__init__.py
|
||||
foo.py
|
||||
bar.py
|
||||
|
||||
This is in fact the default layout expected by the Distutils, and the one that
|
||||
requires the least work to describe in your setup script::
|
||||
|
||||
from distutils.core import setup
|
||||
setup(name='foobar',
|
||||
version='1.0',
|
||||
packages=['foobar'],
|
||||
)
|
||||
|
||||
If you want to put modules in directories not named for their package, then you
|
||||
need to use the :option:`package_dir` option again. For example, if the
|
||||
:file:`src` directory holds modules in the :mod:`foobar` package::
|
||||
|
||||
<root>/
|
||||
setup.py
|
||||
src/
|
||||
__init__.py
|
||||
foo.py
|
||||
bar.py
|
||||
|
||||
an appropriate setup script would be ::
|
||||
|
||||
from distutils.core import setup
|
||||
setup(name='foobar',
|
||||
version='1.0',
|
||||
package_dir={'foobar': 'src'},
|
||||
packages=['foobar'],
|
||||
)
|
||||
|
||||
Or, you might put modules from your main package right in the distribution
|
||||
root::
|
||||
|
||||
<root>/
|
||||
setup.py
|
||||
__init__.py
|
||||
foo.py
|
||||
bar.py
|
||||
|
||||
in which case your setup script would be ::
|
||||
|
||||
from distutils.core import setup
|
||||
setup(name='foobar',
|
||||
version='1.0',
|
||||
package_dir={'foobar': ''},
|
||||
packages=['foobar'],
|
||||
)
|
||||
|
||||
(The empty string also stands for the current directory.)
|
||||
|
||||
If you have sub-packages, they must be explicitly listed in :option:`packages`,
|
||||
but any entries in :option:`package_dir` automatically extend to sub-packages.
|
||||
(In other words, the Distutils does *not* scan your source tree, trying to
|
||||
figure out which directories correspond to Python packages by looking for
|
||||
:file:`__init__.py` files.) Thus, if the default layout grows a sub-package::
|
||||
|
||||
<root>/
|
||||
setup.py
|
||||
foobar/
|
||||
__init__.py
|
||||
foo.py
|
||||
bar.py
|
||||
subfoo/
|
||||
__init__.py
|
||||
blah.py
|
||||
|
||||
then the corresponding setup script would be ::
|
||||
|
||||
from distutils.core import setup
|
||||
setup(name='foobar',
|
||||
version='1.0',
|
||||
packages=['foobar', 'foobar.subfoo'],
|
||||
)
|
||||
|
||||
(Again, the empty string in :option:`package_dir` stands for the current
|
||||
directory.)
|
||||
|
||||
|
||||
.. _single-ext:
|
||||
|
||||
Single extension module
|
||||
=======================
|
||||
|
||||
Extension modules are specified using the :option:`ext_modules` option.
|
||||
:option:`package_dir` has no effect on where extension source files are found;
|
||||
it only affects the source for pure Python modules. The simplest case, a
|
||||
single extension module in a single C source file, is::
|
||||
|
||||
<root>/
|
||||
setup.py
|
||||
foo.c
|
||||
|
||||
If the :mod:`foo` extension belongs in the root package, the setup script for
|
||||
this could be ::
|
||||
|
||||
from distutils.core import setup
|
||||
from distutils.extension import Extension
|
||||
setup(name='foobar',
|
||||
version='1.0',
|
||||
ext_modules=[Extension('foo', ['foo.c'])],
|
||||
)
|
||||
|
||||
If the extension actually belongs in a package, say :mod:`foopkg`, then
|
||||
|
||||
With exactly the same source tree layout, this extension can be put in the
|
||||
:mod:`foopkg` package simply by changing the name of the extension::
|
||||
|
||||
from distutils.core import setup
|
||||
from distutils.extension import Extension
|
||||
setup(name='foobar',
|
||||
version='1.0',
|
||||
ext_modules=[Extension('foopkg.foo', ['foo.c'])],
|
||||
)
|
||||
|
||||
.. % \section{Multiple extension modules}
|
||||
.. % \label{multiple-ext}
|
||||
|
||||
.. % \section{Putting it all together}
|
||||
|
||||
|
||||
96
Doc-26/distutils/extending.rst
Normal file
96
Doc-26/distutils/extending.rst
Normal file
@@ -0,0 +1,96 @@
|
||||
.. _extending:
|
||||
|
||||
*******************
|
||||
Extending Distutils
|
||||
*******************
|
||||
|
||||
Distutils can be extended in various ways. Most extensions take the form of new
|
||||
commands or replacements for existing commands. New commands may be written to
|
||||
support new types of platform-specific packaging, for example, while
|
||||
replacements for existing commands may be made to modify details of how the
|
||||
command operates on a package.
|
||||
|
||||
Most extensions of the distutils are made within :file:`setup.py` scripts that
|
||||
want to modify existing commands; many simply add a few file extensions that
|
||||
should be copied into packages in addition to :file:`.py` files as a
|
||||
convenience.
|
||||
|
||||
Most distutils command implementations are subclasses of the :class:`Command`
|
||||
class from :mod:`distutils.cmd`. New commands may directly inherit from
|
||||
:class:`Command`, while replacements often derive from :class:`Command`
|
||||
indirectly, directly subclassing the command they are replacing. Commands are
|
||||
required to derive from :class:`Command`.
|
||||
|
||||
.. % \section{Extending existing commands}
|
||||
.. % \label{extend-existing}
|
||||
|
||||
.. % \section{Writing new commands}
|
||||
.. % \label{new-commands}
|
||||
.. % \XXX{Would an uninstall command be a good example here?}
|
||||
|
||||
|
||||
Integrating new commands
|
||||
========================
|
||||
|
||||
There are different ways to integrate new command implementations into
|
||||
distutils. The most difficult is to lobby for the inclusion of the new features
|
||||
in distutils itself, and wait for (and require) a version of Python that
|
||||
provides that support. This is really hard for many reasons.
|
||||
|
||||
The most common, and possibly the most reasonable for most needs, is to include
|
||||
the new implementations with your :file:`setup.py` script, and cause the
|
||||
:func:`distutils.core.setup` function use them::
|
||||
|
||||
from distutils.command.build_py import build_py as _build_py
|
||||
from distutils.core import setup
|
||||
|
||||
class build_py(_build_py):
|
||||
"""Specialized Python source builder."""
|
||||
|
||||
# implement whatever needs to be different...
|
||||
|
||||
setup(cmdclass={'build_py': build_py},
|
||||
...)
|
||||
|
||||
This approach is most valuable if the new implementations must be used to use a
|
||||
particular package, as everyone interested in the package will need to have the
|
||||
new command implementation.
|
||||
|
||||
Beginning with Python 2.4, a third option is available, intended to allow new
|
||||
commands to be added which can support existing :file:`setup.py` scripts without
|
||||
requiring modifications to the Python installation. This is expected to allow
|
||||
third-party extensions to provide support for additional packaging systems, but
|
||||
the commands can be used for anything distutils commands can be used for. A new
|
||||
configuration option, :option:`command_packages` (command-line option
|
||||
:option:`--command-packages`), can be used to specify additional packages to be
|
||||
searched for modules implementing commands. Like all distutils options, this
|
||||
can be specified on the command line or in a configuration file. This option
|
||||
can only be set in the ``[global]`` section of a configuration file, or before
|
||||
any commands on the command line. If set in a configuration file, it can be
|
||||
overridden from the command line; setting it to an empty string on the command
|
||||
line causes the default to be used. This should never be set in a configuration
|
||||
file provided with a package.
|
||||
|
||||
This new option can be used to add any number of packages to the list of
|
||||
packages searched for command implementations; multiple package names should be
|
||||
separated by commas. When not specified, the search is only performed in the
|
||||
:mod:`distutils.command` package. When :file:`setup.py` is run with the option
|
||||
:option:`--command-packages` :option:`distcmds,buildcmds`, however, the packages
|
||||
:mod:`distutils.command`, :mod:`distcmds`, and :mod:`buildcmds` will be searched
|
||||
in that order. New commands are expected to be implemented in modules of the
|
||||
same name as the command by classes sharing the same name. Given the example
|
||||
command line option above, the command :command:`bdist_openpkg` could be
|
||||
implemented by the class :class:`distcmds.bdist_openpkg.bdist_openpkg` or
|
||||
:class:`buildcmds.bdist_openpkg.bdist_openpkg`.
|
||||
|
||||
|
||||
Adding new distribution types
|
||||
=============================
|
||||
|
||||
Commands that create distributions (files in the :file:`dist/` directory) need
|
||||
to add ``(command, filename)`` pairs to ``self.distribution.dist_files`` so that
|
||||
:command:`upload` can upload it to PyPI. The *filename* in the pair contains no
|
||||
path information, only the name of the file itself. In dry-run mode, pairs
|
||||
should still be added to represent what would have been created.
|
||||
|
||||
|
||||
28
Doc-26/distutils/index.rst
Normal file
28
Doc-26/distutils/index.rst
Normal file
@@ -0,0 +1,28 @@
|
||||
.. _distutils-index:
|
||||
|
||||
###############################
|
||||
Distributing Python Modules
|
||||
###############################
|
||||
|
||||
:Release: |version|
|
||||
:Date: |today|
|
||||
|
||||
This document describes the Python Distribution Utilities ("Distutils") from
|
||||
the module developer's point of view, describing how to use the Distutils to
|
||||
make Python modules and extensions easily available to a wider audience with
|
||||
very little overhead for build/release/install mechanics.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
introduction.rst
|
||||
setupscript.rst
|
||||
configfile.rst
|
||||
sourcedist.rst
|
||||
builtdist.rst
|
||||
packageindex.rst
|
||||
uploading.rst
|
||||
examples.rst
|
||||
extending.rst
|
||||
commandref.rst
|
||||
apiref.rst
|
||||
208
Doc-26/distutils/introduction.rst
Normal file
208
Doc-26/distutils/introduction.rst
Normal file
@@ -0,0 +1,208 @@
|
||||
.. _intro:
|
||||
|
||||
****************************
|
||||
An Introduction to Distutils
|
||||
****************************
|
||||
|
||||
This document covers using the Distutils to distribute your Python modules,
|
||||
concentrating on the role of developer/distributor: if you're looking for
|
||||
information on installing Python modules, you should refer to the Installing
|
||||
Python Modules (XXX reference: ../inst/inst.html) manual.
|
||||
|
||||
|
||||
.. _concepts:
|
||||
|
||||
Concepts & Terminology
|
||||
======================
|
||||
|
||||
Using the Distutils is quite simple, both for module developers and for
|
||||
users/administrators installing third-party modules. As a developer, your
|
||||
responsibilities (apart from writing solid, well-documented and well-tested
|
||||
code, of course!) are:
|
||||
|
||||
* write a setup script (:file:`setup.py` by convention)
|
||||
|
||||
* (optional) write a setup configuration file
|
||||
|
||||
* create a source distribution
|
||||
|
||||
* (optional) create one or more built (binary) distributions
|
||||
|
||||
Each of these tasks is covered in this document.
|
||||
|
||||
Not all module developers have access to a multitude of platforms, so it's not
|
||||
always feasible to expect them to create a multitude of built distributions. It
|
||||
is hoped that a class of intermediaries, called *packagers*, will arise to
|
||||
address this need. Packagers will take source distributions released by module
|
||||
developers, build them on one or more platforms, and release the resulting built
|
||||
distributions. Thus, users on the most popular platforms will be able to
|
||||
install most popular Python module distributions in the most natural way for
|
||||
their platform, without having to run a single setup script or compile a line of
|
||||
code.
|
||||
|
||||
|
||||
.. _simple-example:
|
||||
|
||||
A Simple Example
|
||||
================
|
||||
|
||||
The setup script is usually quite simple, although since it's written in Python,
|
||||
there are no arbitrary limits to what you can do with it, though you should be
|
||||
careful about putting arbitrarily expensive operations in your setup script.
|
||||
Unlike, say, Autoconf-style configure scripts, the setup script may be run
|
||||
multiple times in the course of building and installing your module
|
||||
distribution.
|
||||
|
||||
If all you want to do is distribute a module called :mod:`foo`, contained in a
|
||||
file :file:`foo.py`, then your setup script can be as simple as this::
|
||||
|
||||
from distutils.core import setup
|
||||
setup(name='foo',
|
||||
version='1.0',
|
||||
py_modules=['foo'],
|
||||
)
|
||||
|
||||
Some observations:
|
||||
|
||||
* most information that you supply to the Distutils is supplied as keyword
|
||||
arguments to the :func:`setup` function
|
||||
|
||||
* those keyword arguments fall into two categories: package metadata (name,
|
||||
version number) and information about what's in the package (a list of pure
|
||||
Python modules, in this case)
|
||||
|
||||
* modules are specified by module name, not filename (the same will hold true
|
||||
for packages and extensions)
|
||||
|
||||
* it's recommended that you supply a little more metadata, in particular your
|
||||
name, email address and a URL for the project (see section :ref:`setup-script`
|
||||
for an example)
|
||||
|
||||
To create a source distribution for this module, you would create a setup
|
||||
script, :file:`setup.py`, containing the above code, and run::
|
||||
|
||||
python setup.py sdist
|
||||
|
||||
which will create an archive file (e.g., tarball on Unix, ZIP file on Windows)
|
||||
containing your setup script :file:`setup.py`, and your module :file:`foo.py`.
|
||||
The archive file will be named :file:`foo-1.0.tar.gz` (or :file:`.zip`), and
|
||||
will unpack into a directory :file:`foo-1.0`.
|
||||
|
||||
If an end-user wishes to install your :mod:`foo` module, all she has to do is
|
||||
download :file:`foo-1.0.tar.gz` (or :file:`.zip`), unpack it, and---from the
|
||||
:file:`foo-1.0` directory---run ::
|
||||
|
||||
python setup.py install
|
||||
|
||||
which will ultimately copy :file:`foo.py` to the appropriate directory for
|
||||
third-party modules in their Python installation.
|
||||
|
||||
This simple example demonstrates some fundamental concepts of the Distutils.
|
||||
First, both developers and installers have the same basic user interface, i.e.
|
||||
the setup script. The difference is which Distutils *commands* they use: the
|
||||
:command:`sdist` command is almost exclusively for module developers, while
|
||||
:command:`install` is more often for installers (although most developers will
|
||||
want to install their own code occasionally).
|
||||
|
||||
If you want to make things really easy for your users, you can create one or
|
||||
more built distributions for them. For instance, if you are running on a
|
||||
Windows machine, and want to make things easy for other Windows users, you can
|
||||
create an executable installer (the most appropriate type of built distribution
|
||||
for this platform) with the :command:`bdist_wininst` command. For example::
|
||||
|
||||
python setup.py bdist_wininst
|
||||
|
||||
will create an executable installer, :file:`foo-1.0.win32.exe`, in the current
|
||||
directory.
|
||||
|
||||
Other useful built distribution formats are RPM, implemented by the
|
||||
:command:`bdist_rpm` command, Solaris :program:`pkgtool`
|
||||
(:command:`bdist_pkgtool`), and HP-UX :program:`swinstall`
|
||||
(:command:`bdist_sdux`). For example, the following command will create an RPM
|
||||
file called :file:`foo-1.0.noarch.rpm`::
|
||||
|
||||
python setup.py bdist_rpm
|
||||
|
||||
(The :command:`bdist_rpm` command uses the :command:`rpm` executable, therefore
|
||||
this has to be run on an RPM-based system such as Red Hat Linux, SuSE Linux, or
|
||||
Mandrake Linux.)
|
||||
|
||||
You can find out what distribution formats are available at any time by running
|
||||
::
|
||||
|
||||
python setup.py bdist --help-formats
|
||||
|
||||
|
||||
.. _python-terms:
|
||||
|
||||
General Python terminology
|
||||
==========================
|
||||
|
||||
If you're reading this document, you probably have a good idea of what modules,
|
||||
extensions, and so forth are. Nevertheless, just to be sure that everyone is
|
||||
operating from a common starting point, we offer the following glossary of
|
||||
common Python terms:
|
||||
|
||||
module
|
||||
the basic unit of code reusability in Python: a block of code imported by some
|
||||
other code. Three types of modules concern us here: pure Python modules,
|
||||
extension modules, and packages.
|
||||
|
||||
pure Python module
|
||||
a module written in Python and contained in a single :file:`.py` file (and
|
||||
possibly associated :file:`.pyc` and/or :file:`.pyo` files). Sometimes referred
|
||||
to as a "pure module."
|
||||
|
||||
extension module
|
||||
a module written in the low-level language of the Python implementation: C/C++
|
||||
for Python, Java for Jython. Typically contained in a single dynamically
|
||||
loadable pre-compiled file, e.g. a shared object (:file:`.so`) file for Python
|
||||
extensions on Unix, a DLL (given the :file:`.pyd` extension) for Python
|
||||
extensions on Windows, or a Java class file for Jython extensions. (Note that
|
||||
currently, the Distutils only handles C/C++ extensions for Python.)
|
||||
|
||||
package
|
||||
a module that contains other modules; typically contained in a directory in the
|
||||
filesystem and distinguished from other directories by the presence of a file
|
||||
:file:`__init__.py`.
|
||||
|
||||
root package
|
||||
the root of the hierarchy of packages. (This isn't really a package, since it
|
||||
doesn't have an :file:`__init__.py` file. But we have to call it something.)
|
||||
The vast majority of the standard library is in the root package, as are many
|
||||
small, standalone third-party modules that don't belong to a larger module
|
||||
collection. Unlike regular packages, modules in the root package can be found in
|
||||
many directories: in fact, every directory listed in ``sys.path`` contributes
|
||||
modules to the root package.
|
||||
|
||||
|
||||
.. _distutils-term:
|
||||
|
||||
Distutils-specific terminology
|
||||
==============================
|
||||
|
||||
The following terms apply more specifically to the domain of distributing Python
|
||||
modules using the Distutils:
|
||||
|
||||
module distribution
|
||||
a collection of Python modules distributed together as a single downloadable
|
||||
resource and meant to be installed *en masse*. Examples of some well-known
|
||||
module distributions are Numeric Python, PyXML, PIL (the Python Imaging
|
||||
Library), or mxBase. (This would be called a *package*, except that term is
|
||||
already taken in the Python context: a single module distribution may contain
|
||||
zero, one, or many Python packages.)
|
||||
|
||||
pure module distribution
|
||||
a module distribution that contains only pure Python modules and packages.
|
||||
Sometimes referred to as a "pure distribution."
|
||||
|
||||
non-pure module distribution
|
||||
a module distribution that contains at least one extension module. Sometimes
|
||||
referred to as a "non-pure distribution."
|
||||
|
||||
distribution root
|
||||
the top-level directory of your source tree (or source distribution); the
|
||||
directory where :file:`setup.py` exists. Generally :file:`setup.py` will be
|
||||
run from this directory.
|
||||
|
||||
|
||||
65
Doc-26/distutils/packageindex.rst
Normal file
65
Doc-26/distutils/packageindex.rst
Normal file
@@ -0,0 +1,65 @@
|
||||
.. _package-index:
|
||||
|
||||
**********************************
|
||||
Registering with the Package Index
|
||||
**********************************
|
||||
|
||||
The Python Package Index (PyPI) holds meta-data describing distributions
|
||||
packaged with distutils. The distutils command :command:`register` is used to
|
||||
submit your distribution's meta-data to the index. It is invoked as follows::
|
||||
|
||||
python setup.py register
|
||||
|
||||
Distutils will respond with the following prompt::
|
||||
|
||||
running register
|
||||
We need to know who you are, so please choose either:
|
||||
1. use your existing login,
|
||||
2. register as a new user,
|
||||
3. have the server generate a new password for you (and email it to you), or
|
||||
4. quit
|
||||
Your selection [default 1]:
|
||||
|
||||
Note: if your username and password are saved locally, you will not see this
|
||||
menu.
|
||||
|
||||
If you have not registered with PyPI, then you will need to do so now. You
|
||||
should choose option 2, and enter your details as required. Soon after
|
||||
submitting your details, you will receive an email which will be used to confirm
|
||||
your registration.
|
||||
|
||||
Once you are registered, you may choose option 1 from the menu. You will be
|
||||
prompted for your PyPI username and password, and :command:`register` will then
|
||||
submit your meta-data to the index.
|
||||
|
||||
You may submit any number of versions of your distribution to the index. If you
|
||||
alter the meta-data for a particular version, you may submit it again and the
|
||||
index will be updated.
|
||||
|
||||
PyPI holds a record for each (name, version) combination submitted. The first
|
||||
user to submit information for a given name is designated the Owner of that
|
||||
name. They may submit changes through the :command:`register` command or through
|
||||
the web interface. They may also designate other users as Owners or Maintainers.
|
||||
Maintainers may edit the package information, but not designate other Owners or
|
||||
Maintainers.
|
||||
|
||||
By default PyPI will list all versions of a given package. To hide certain
|
||||
versions, the Hidden property should be set to yes. This must be edited through
|
||||
the web interface.
|
||||
|
||||
|
||||
.. _pypirc:
|
||||
|
||||
The .pypirc file
|
||||
================
|
||||
|
||||
The format of the :file:`.pypirc` file is formated as follows::
|
||||
|
||||
[server-login]
|
||||
repository: <repository-url>
|
||||
username: <username>
|
||||
password: <password>
|
||||
|
||||
*repository* can be ommitted and defaults to ``http://www.python.org/pypi``.
|
||||
|
||||
|
||||
669
Doc-26/distutils/setupscript.rst
Normal file
669
Doc-26/distutils/setupscript.rst
Normal file
@@ -0,0 +1,669 @@
|
||||
.. _setup-script:
|
||||
|
||||
************************
|
||||
Writing the Setup Script
|
||||
************************
|
||||
|
||||
The setup script is the centre of all activity in building, distributing, and
|
||||
installing modules using the Distutils. The main purpose of the setup script is
|
||||
to describe your module distribution to the Distutils, so that the various
|
||||
commands that operate on your modules do the right thing. As we saw in section
|
||||
:ref:`simple-example` above, the setup script consists mainly of a call to
|
||||
:func:`setup`, and most information supplied to the Distutils by the module
|
||||
developer is supplied as keyword arguments to :func:`setup`.
|
||||
|
||||
Here's a slightly more involved example, which we'll follow for the next couple
|
||||
of sections: the Distutils' own setup script. (Keep in mind that although the
|
||||
Distutils are included with Python 1.6 and later, they also have an independent
|
||||
existence so that Python 1.5.2 users can use them to install other module
|
||||
distributions. The Distutils' own setup script, shown here, is used to install
|
||||
the package into Python 1.5.2.) ::
|
||||
|
||||
#!/usr/bin/env python
|
||||
|
||||
from distutils.core import setup
|
||||
|
||||
setup(name='Distutils',
|
||||
version='1.0',
|
||||
description='Python Distribution Utilities',
|
||||
author='Greg Ward',
|
||||
author_email='gward@python.net',
|
||||
url='http://www.python.org/sigs/distutils-sig/',
|
||||
packages=['distutils', 'distutils.command'],
|
||||
)
|
||||
|
||||
There are only two differences between this and the trivial one-file
|
||||
distribution presented in section :ref:`simple-example`: more metadata, and the
|
||||
specification of pure Python modules by package, rather than by module. This is
|
||||
important since the Distutils consist of a couple of dozen modules split into
|
||||
(so far) two packages; an explicit list of every module would be tedious to
|
||||
generate and difficult to maintain. For more information on the additional
|
||||
meta-data, see section :ref:`meta-data`.
|
||||
|
||||
Note that any pathnames (files or directories) supplied in the setup script
|
||||
should be written using the Unix convention, i.e. slash-separated. The
|
||||
Distutils will take care of converting this platform-neutral representation into
|
||||
whatever is appropriate on your current platform before actually using the
|
||||
pathname. This makes your setup script portable across operating systems, which
|
||||
of course is one of the major goals of the Distutils. In this spirit, all
|
||||
pathnames in this document are slash-separated. (Mac OS 9 programmers should
|
||||
keep in mind that the *absence* of a leading slash indicates a relative path,
|
||||
the opposite of the Mac OS convention with colons.)
|
||||
|
||||
This, of course, only applies to pathnames given to Distutils functions. If
|
||||
you, for example, use standard Python functions such as :func:`glob.glob` or
|
||||
:func:`os.listdir` to specify files, you should be careful to write portable
|
||||
code instead of hardcoding path separators::
|
||||
|
||||
glob.glob(os.path.join('mydir', 'subdir', '*.html'))
|
||||
os.listdir(os.path.join('mydir', 'subdir'))
|
||||
|
||||
|
||||
.. _listing-packages:
|
||||
|
||||
Listing whole packages
|
||||
======================
|
||||
|
||||
The :option:`packages` option tells the Distutils to process (build, distribute,
|
||||
install, etc.) all pure Python modules found in each package mentioned in the
|
||||
:option:`packages` list. In order to do this, of course, there has to be a
|
||||
correspondence between package names and directories in the filesystem. The
|
||||
default correspondence is the most obvious one, i.e. package :mod:`distutils` is
|
||||
found in the directory :file:`distutils` relative to the distribution root.
|
||||
Thus, when you say ``packages = ['foo']`` in your setup script, you are
|
||||
promising that the Distutils will find a file :file:`foo/__init__.py` (which
|
||||
might be spelled differently on your system, but you get the idea) relative to
|
||||
the directory where your setup script lives. If you break this promise, the
|
||||
Distutils will issue a warning but still process the broken package anyways.
|
||||
|
||||
If you use a different convention to lay out your source directory, that's no
|
||||
problem: you just have to supply the :option:`package_dir` option to tell the
|
||||
Distutils about your convention. For example, say you keep all Python source
|
||||
under :file:`lib`, so that modules in the "root package" (i.e., not in any
|
||||
package at all) are in :file:`lib`, modules in the :mod:`foo` package are in
|
||||
:file:`lib/foo`, and so forth. Then you would put ::
|
||||
|
||||
package_dir = {'': 'lib'}
|
||||
|
||||
in your setup script. The keys to this dictionary are package names, and an
|
||||
empty package name stands for the root package. The values are directory names
|
||||
relative to your distribution root. In this case, when you say ``packages =
|
||||
['foo']``, you are promising that the file :file:`lib/foo/__init__.py` exists.
|
||||
|
||||
Another possible convention is to put the :mod:`foo` package right in
|
||||
:file:`lib`, the :mod:`foo.bar` package in :file:`lib/bar`, etc. This would be
|
||||
written in the setup script as ::
|
||||
|
||||
package_dir = {'foo': 'lib'}
|
||||
|
||||
A ``package: dir`` entry in the :option:`package_dir` dictionary implicitly
|
||||
applies to all packages below *package*, so the :mod:`foo.bar` case is
|
||||
automatically handled here. In this example, having ``packages = ['foo',
|
||||
'foo.bar']`` tells the Distutils to look for :file:`lib/__init__.py` and
|
||||
:file:`lib/bar/__init__.py`. (Keep in mind that although :option:`package_dir`
|
||||
applies recursively, you must explicitly list all packages in
|
||||
:option:`packages`: the Distutils will *not* recursively scan your source tree
|
||||
looking for any directory with an :file:`__init__.py` file.)
|
||||
|
||||
|
||||
.. _listing-modules:
|
||||
|
||||
Listing individual modules
|
||||
==========================
|
||||
|
||||
For a small module distribution, you might prefer to list all modules rather
|
||||
than listing packages---especially the case of a single module that goes in the
|
||||
"root package" (i.e., no package at all). This simplest case was shown in
|
||||
section :ref:`simple-example`; here is a slightly more involved example::
|
||||
|
||||
py_modules = ['mod1', 'pkg.mod2']
|
||||
|
||||
This describes two modules, one of them in the "root" package, the other in the
|
||||
:mod:`pkg` package. Again, the default package/directory layout implies that
|
||||
these two modules can be found in :file:`mod1.py` and :file:`pkg/mod2.py`, and
|
||||
that :file:`pkg/__init__.py` exists as well. And again, you can override the
|
||||
package/directory correspondence using the :option:`package_dir` option.
|
||||
|
||||
|
||||
.. _describing-extensions:
|
||||
|
||||
Describing extension modules
|
||||
============================
|
||||
|
||||
Just as writing Python extension modules is a bit more complicated than writing
|
||||
pure Python modules, describing them to the Distutils is a bit more complicated.
|
||||
Unlike pure modules, it's not enough just to list modules or packages and expect
|
||||
the Distutils to go out and find the right files; you have to specify the
|
||||
extension name, source file(s), and any compile/link requirements (include
|
||||
directories, libraries to link with, etc.).
|
||||
|
||||
.. % XXX read over this section
|
||||
|
||||
All of this is done through another keyword argument to :func:`setup`, the
|
||||
:option:`ext_modules` option. :option:`ext_modules` is just a list of
|
||||
:class:`Extension` instances, each of which describes a single extension module.
|
||||
Suppose your distribution includes a single extension, called :mod:`foo` and
|
||||
implemented by :file:`foo.c`. If no additional instructions to the
|
||||
compiler/linker are needed, describing this extension is quite simple::
|
||||
|
||||
Extension('foo', ['foo.c'])
|
||||
|
||||
The :class:`Extension` class can be imported from :mod:`distutils.core` along
|
||||
with :func:`setup`. Thus, the setup script for a module distribution that
|
||||
contains only this one extension and nothing else might be::
|
||||
|
||||
from distutils.core import setup, Extension
|
||||
setup(name='foo',
|
||||
version='1.0',
|
||||
ext_modules=[Extension('foo', ['foo.c'])],
|
||||
)
|
||||
|
||||
The :class:`Extension` class (actually, the underlying extension-building
|
||||
machinery implemented by the :command:`build_ext` command) supports a great deal
|
||||
of flexibility in describing Python extensions, which is explained in the
|
||||
following sections.
|
||||
|
||||
|
||||
Extension names and packages
|
||||
----------------------------
|
||||
|
||||
The first argument to the :class:`Extension` constructor is always the name of
|
||||
the extension, including any package names. For example, ::
|
||||
|
||||
Extension('foo', ['src/foo1.c', 'src/foo2.c'])
|
||||
|
||||
describes an extension that lives in the root package, while ::
|
||||
|
||||
Extension('pkg.foo', ['src/foo1.c', 'src/foo2.c'])
|
||||
|
||||
describes the same extension in the :mod:`pkg` package. The source files and
|
||||
resulting object code are identical in both cases; the only difference is where
|
||||
in the filesystem (and therefore where in Python's namespace hierarchy) the
|
||||
resulting extension lives.
|
||||
|
||||
If you have a number of extensions all in the same package (or all under the
|
||||
same base package), use the :option:`ext_package` keyword argument to
|
||||
:func:`setup`. For example, ::
|
||||
|
||||
setup(...
|
||||
ext_package='pkg',
|
||||
ext_modules=[Extension('foo', ['foo.c']),
|
||||
Extension('subpkg.bar', ['bar.c'])],
|
||||
)
|
||||
|
||||
will compile :file:`foo.c` to the extension :mod:`pkg.foo`, and :file:`bar.c` to
|
||||
:mod:`pkg.subpkg.bar`.
|
||||
|
||||
|
||||
Extension source files
|
||||
----------------------
|
||||
|
||||
The second argument to the :class:`Extension` constructor is a list of source
|
||||
files. Since the Distutils currently only support C, C++, and Objective-C
|
||||
extensions, these are normally C/C++/Objective-C source files. (Be sure to use
|
||||
appropriate extensions to distinguish C++\ source files: :file:`.cc` and
|
||||
:file:`.cpp` seem to be recognized by both Unix and Windows compilers.)
|
||||
|
||||
However, you can also include SWIG interface (:file:`.i`) files in the list; the
|
||||
:command:`build_ext` command knows how to deal with SWIG extensions: it will run
|
||||
SWIG on the interface file and compile the resulting C/C++ file into your
|
||||
extension.
|
||||
|
||||
**\*\*** SWIG support is rough around the edges and largely untested! **\*\***
|
||||
|
||||
This warning notwithstanding, options to SWIG can be currently passed like
|
||||
this::
|
||||
|
||||
setup(...
|
||||
ext_modules=[Extension('_foo', ['foo.i'],
|
||||
swig_opts=['-modern', '-I../include'])],
|
||||
py_modules=['foo'],
|
||||
)
|
||||
|
||||
Or on the commandline like this::
|
||||
|
||||
> python setup.py build_ext --swig-opts="-modern -I../include"
|
||||
|
||||
On some platforms, you can include non-source files that are processed by the
|
||||
compiler and included in your extension. Currently, this just means Windows
|
||||
message text (:file:`.mc`) files and resource definition (:file:`.rc`) files for
|
||||
Visual C++. These will be compiled to binary resource (:file:`.res`) files and
|
||||
linked into the executable.
|
||||
|
||||
|
||||
Preprocessor options
|
||||
--------------------
|
||||
|
||||
Three optional arguments to :class:`Extension` will help if you need to specify
|
||||
include directories to search or preprocessor macros to define/undefine:
|
||||
``include_dirs``, ``define_macros``, and ``undef_macros``.
|
||||
|
||||
For example, if your extension requires header files in the :file:`include`
|
||||
directory under your distribution root, use the ``include_dirs`` option::
|
||||
|
||||
Extension('foo', ['foo.c'], include_dirs=['include'])
|
||||
|
||||
You can specify absolute directories there; if you know that your extension will
|
||||
only be built on Unix systems with X11R6 installed to :file:`/usr`, you can get
|
||||
away with ::
|
||||
|
||||
Extension('foo', ['foo.c'], include_dirs=['/usr/include/X11'])
|
||||
|
||||
You should avoid this sort of non-portable usage if you plan to distribute your
|
||||
code: it's probably better to write C code like ::
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
If you need to include header files from some other Python extension, you can
|
||||
take advantage of the fact that header files are installed in a consistent way
|
||||
by the Distutils :command:`install_header` command. For example, the Numerical
|
||||
Python header files are installed (on a standard Unix installation) to
|
||||
:file:`/usr/local/include/python1.5/Numerical`. (The exact location will differ
|
||||
according to your platform and Python installation.) Since the Python include
|
||||
directory---\ :file:`/usr/local/include/python1.5` in this case---is always
|
||||
included in the search path when building Python extensions, the best approach
|
||||
is to write C code like ::
|
||||
|
||||
#include <Numerical/arrayobject.h>
|
||||
|
||||
If you must put the :file:`Numerical` include directory right into your header
|
||||
search path, though, you can find that directory using the Distutils
|
||||
:mod:`distutils.sysconfig` module::
|
||||
|
||||
from distutils.sysconfig import get_python_inc
|
||||
incdir = os.path.join(get_python_inc(plat_specific=1), 'Numerical')
|
||||
setup(...,
|
||||
Extension(..., include_dirs=[incdir]),
|
||||
)
|
||||
|
||||
Even though this is quite portable---it will work on any Python installation,
|
||||
regardless of platform---it's probably easier to just write your C code in the
|
||||
sensible way.
|
||||
|
||||
You can define and undefine pre-processor macros with the ``define_macros`` and
|
||||
``undef_macros`` options. ``define_macros`` takes a list of ``(name, value)``
|
||||
tuples, where ``name`` is the name of the macro to define (a string) and
|
||||
``value`` is its value: either a string or ``None``. (Defining a macro ``FOO``
|
||||
to ``None`` is the equivalent of a bare ``#define FOO`` in your C source: with
|
||||
most compilers, this sets ``FOO`` to the string ``1``.) ``undef_macros`` is
|
||||
just a list of macros to undefine.
|
||||
|
||||
For example::
|
||||
|
||||
Extension(...,
|
||||
define_macros=[('NDEBUG', '1'),
|
||||
('HAVE_STRFTIME', None)],
|
||||
undef_macros=['HAVE_FOO', 'HAVE_BAR'])
|
||||
|
||||
is the equivalent of having this at the top of every C source file::
|
||||
|
||||
#define NDEBUG 1
|
||||
#define HAVE_STRFTIME
|
||||
#undef HAVE_FOO
|
||||
#undef HAVE_BAR
|
||||
|
||||
|
||||
Library options
|
||||
---------------
|
||||
|
||||
You can also specify the libraries to link against when building your extension,
|
||||
and the directories to search for those libraries. The ``libraries`` option is
|
||||
a list of libraries to link against, ``library_dirs`` is a list of directories
|
||||
to search for libraries at link-time, and ``runtime_library_dirs`` is a list of
|
||||
directories to search for shared (dynamically loaded) libraries at run-time.
|
||||
|
||||
For example, if you need to link against libraries known to be in the standard
|
||||
library search path on target systems ::
|
||||
|
||||
Extension(...,
|
||||
libraries=['gdbm', 'readline'])
|
||||
|
||||
If you need to link with libraries in a non-standard location, you'll have to
|
||||
include the location in ``library_dirs``::
|
||||
|
||||
Extension(...,
|
||||
library_dirs=['/usr/X11R6/lib'],
|
||||
libraries=['X11', 'Xt'])
|
||||
|
||||
(Again, this sort of non-portable construct should be avoided if you intend to
|
||||
distribute your code.)
|
||||
|
||||
**\*\*** Should mention clib libraries here or somewhere else! **\*\***
|
||||
|
||||
|
||||
Other options
|
||||
-------------
|
||||
|
||||
There are still some other options which can be used to handle special cases.
|
||||
|
||||
The :option:`extra_objects` option is a list of object files to be passed to the
|
||||
linker. These files must not have extensions, as the default extension for the
|
||||
compiler is used.
|
||||
|
||||
:option:`extra_compile_args` and :option:`extra_link_args` can be used to
|
||||
specify additional command line options for the respective compiler and linker
|
||||
command lines.
|
||||
|
||||
:option:`export_symbols` is only useful on Windows. It can contain a list of
|
||||
symbols (functions or variables) to be exported. This option is not needed when
|
||||
building compiled extensions: Distutils will automatically add ``initmodule``
|
||||
to the list of exported symbols.
|
||||
|
||||
|
||||
Relationships between Distributions and Packages
|
||||
================================================
|
||||
|
||||
A distribution may relate to packages in three specific ways:
|
||||
|
||||
#. It can require packages or modules.
|
||||
|
||||
#. It can provide packages or modules.
|
||||
|
||||
#. It can obsolete packages or modules.
|
||||
|
||||
These relationships can be specified using keyword arguments to the
|
||||
:func:`distutils.core.setup` function.
|
||||
|
||||
Dependencies on other Python modules and packages can be specified by supplying
|
||||
the *requires* keyword argument to :func:`setup`. The value must be a list of
|
||||
strings. Each string specifies a package that is required, and optionally what
|
||||
versions are sufficient.
|
||||
|
||||
To specify that any version of a module or package is required, the string
|
||||
should consist entirely of the module or package name. Examples include
|
||||
``'mymodule'`` and ``'xml.parsers.expat'``.
|
||||
|
||||
If specific versions are required, a sequence of qualifiers can be supplied in
|
||||
parentheses. Each qualifier may consist of a comparison operator and a version
|
||||
number. The accepted comparison operators are::
|
||||
|
||||
< > ==
|
||||
<= >= !=
|
||||
|
||||
These can be combined by using multiple qualifiers separated by commas (and
|
||||
optional whitespace). In this case, all of the qualifiers must be matched; a
|
||||
logical AND is used to combine the evaluations.
|
||||
|
||||
Let's look at a bunch of examples:
|
||||
|
||||
+-------------------------+----------------------------------------------+
|
||||
| Requires Expression | Explanation |
|
||||
+=========================+==============================================+
|
||||
| ``==1.0`` | Only version ``1.0`` is compatible |
|
||||
+-------------------------+----------------------------------------------+
|
||||
| ``>1.0, !=1.5.1, <2.0`` | Any version after ``1.0`` and before ``2.0`` |
|
||||
| | is compatible, except ``1.5.1`` |
|
||||
+-------------------------+----------------------------------------------+
|
||||
|
||||
Now that we can specify dependencies, we also need to be able to specify what we
|
||||
provide that other distributions can require. This is done using the *provides*
|
||||
keyword argument to :func:`setup`. The value for this keyword is a list of
|
||||
strings, each of which names a Python module or package, and optionally
|
||||
identifies the version. If the version is not specified, it is assumed to match
|
||||
that of the distribution.
|
||||
|
||||
Some examples:
|
||||
|
||||
+---------------------+----------------------------------------------+
|
||||
| Provides Expression | Explanation |
|
||||
+=====================+==============================================+
|
||||
| ``mypkg`` | Provide ``mypkg``, using the distribution |
|
||||
| | version |
|
||||
+---------------------+----------------------------------------------+
|
||||
| ``mypkg (1.1)`` | Provide ``mypkg`` version 1.1, regardless of |
|
||||
| | the distribution version |
|
||||
+---------------------+----------------------------------------------+
|
||||
|
||||
A package can declare that it obsoletes other packages using the *obsoletes*
|
||||
keyword argument. The value for this is similar to that of the *requires*
|
||||
keyword: a list of strings giving module or package specifiers. Each specifier
|
||||
consists of a module or package name optionally followed by one or more version
|
||||
qualifiers. Version qualifiers are given in parentheses after the module or
|
||||
package name.
|
||||
|
||||
The versions identified by the qualifiers are those that are obsoleted by the
|
||||
distribution being described. If no qualifiers are given, all versions of the
|
||||
named module or package are understood to be obsoleted.
|
||||
|
||||
|
||||
Installing Scripts
|
||||
==================
|
||||
|
||||
So far we have been dealing with pure and non-pure Python modules, which are
|
||||
usually not run by themselves but imported by scripts.
|
||||
|
||||
Scripts are files containing Python source code, intended to be started from the
|
||||
command line. Scripts don't require Distutils to do anything very complicated.
|
||||
The only clever feature is that if the first line of the script starts with
|
||||
``#!`` and contains the word "python", the Distutils will adjust the first line
|
||||
to refer to the current interpreter location. By default, it is replaced with
|
||||
the current interpreter location. The :option:`--executable` (or :option:`-e`)
|
||||
option will allow the interpreter path to be explicitly overridden.
|
||||
|
||||
The :option:`scripts` option simply is a list of files to be handled in this
|
||||
way. From the PyXML setup script::
|
||||
|
||||
setup(...
|
||||
scripts=['scripts/xmlproc_parse', 'scripts/xmlproc_val']
|
||||
)
|
||||
|
||||
|
||||
Installing Package Data
|
||||
=======================
|
||||
|
||||
Often, additional files need to be installed into a package. These files are
|
||||
often data that's closely related to the package's implementation, or text files
|
||||
containing documentation that might be of interest to programmers using the
|
||||
package. These files are called :dfn:`package data`.
|
||||
|
||||
Package data can be added to packages using the ``package_data`` keyword
|
||||
argument to the :func:`setup` function. The value must be a mapping from
|
||||
package name to a list of relative path names that should be copied into the
|
||||
package. The paths are interpreted as relative to the directory containing the
|
||||
package (information from the ``package_dir`` mapping is used if appropriate);
|
||||
that is, the files are expected to be part of the package in the source
|
||||
directories. They may contain glob patterns as well.
|
||||
|
||||
The path names may contain directory portions; any necessary directories will be
|
||||
created in the installation.
|
||||
|
||||
For example, if a package should contain a subdirectory with several data files,
|
||||
the files can be arranged like this in the source tree::
|
||||
|
||||
setup.py
|
||||
src/
|
||||
mypkg/
|
||||
__init__.py
|
||||
module.py
|
||||
data/
|
||||
tables.dat
|
||||
spoons.dat
|
||||
forks.dat
|
||||
|
||||
The corresponding call to :func:`setup` might be::
|
||||
|
||||
setup(...,
|
||||
packages=['mypkg'],
|
||||
package_dir={'mypkg': 'src/mypkg'},
|
||||
package_data={'mypkg': ['data/*.dat']},
|
||||
)
|
||||
|
||||
.. versionadded:: 2.4
|
||||
|
||||
|
||||
Installing Additional Files
|
||||
===========================
|
||||
|
||||
The :option:`data_files` option can be used to specify additional files needed
|
||||
by the module distribution: configuration files, message catalogs, data files,
|
||||
anything which doesn't fit in the previous categories.
|
||||
|
||||
:option:`data_files` specifies a sequence of (*directory*, *files*) pairs in the
|
||||
following way::
|
||||
|
||||
setup(...
|
||||
data_files=[('bitmaps', ['bm/b1.gif', 'bm/b2.gif']),
|
||||
('config', ['cfg/data.cfg']),
|
||||
('/etc/init.d', ['init-script'])]
|
||||
)
|
||||
|
||||
Note that you can specify the directory names where the data files will be
|
||||
installed, but you cannot rename the data files themselves.
|
||||
|
||||
Each (*directory*, *files*) pair in the sequence specifies the installation
|
||||
directory and the files to install there. If *directory* is a relative path, it
|
||||
is interpreted relative to the installation prefix (Python's ``sys.prefix`` for
|
||||
pure-Python packages, ``sys.exec_prefix`` for packages that contain extension
|
||||
modules). Each file name in *files* is interpreted relative to the
|
||||
:file:`setup.py` script at the top of the package source distribution. No
|
||||
directory information from *files* is used to determine the final location of
|
||||
the installed file; only the name of the file is used.
|
||||
|
||||
You can specify the :option:`data_files` options as a simple sequence of files
|
||||
without specifying a target directory, but this is not recommended, and the
|
||||
:command:`install` command will print a warning in this case. To install data
|
||||
files directly in the target directory, an empty string should be given as the
|
||||
directory.
|
||||
|
||||
|
||||
.. _meta-data:
|
||||
|
||||
Additional meta-data
|
||||
====================
|
||||
|
||||
The setup script may include additional meta-data beyond the name and version.
|
||||
This information includes:
|
||||
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| Meta-Data | Description | Value | Notes |
|
||||
+======================+===========================+=================+========+
|
||||
| ``name`` | name of the package | short string | \(1) |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``version`` | version of this release | short string | (1)(2) |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``author`` | package author's name | short string | \(3) |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``author_email`` | email address of the | email address | \(3) |
|
||||
| | package author | | |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``maintainer`` | package maintainer's name | short string | \(3) |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``maintainer_email`` | email address of the | email address | \(3) |
|
||||
| | package maintainer | | |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``url`` | home page for the package | URL | \(1) |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``description`` | short, summary | short string | |
|
||||
| | description of the | | |
|
||||
| | package | | |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``long_description`` | longer description of the | long string | |
|
||||
| | package | | |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``download_url`` | location where the | URL | \(4) |
|
||||
| | package may be downloaded | | |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``classifiers`` | a list of classifiers | list of strings | \(4) |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
|
||||
Notes:
|
||||
|
||||
(1)
|
||||
These fields are required.
|
||||
|
||||
(2)
|
||||
It is recommended that versions take the form *major.minor[.patch[.sub]]*.
|
||||
|
||||
(3)
|
||||
Either the author or the maintainer must be identified.
|
||||
|
||||
(4)
|
||||
These fields should not be used if your package is to be compatible with Python
|
||||
versions prior to 2.2.3 or 2.3. The list is available from the `PyPI website
|
||||
<http://www.python.org/pypi>`_.
|
||||
|
||||
'short string'
|
||||
A single line of text, not more than 200 characters.
|
||||
|
||||
'long string'
|
||||
Multiple lines of plain text in reStructuredText format (see
|
||||
http://docutils.sf.net/).
|
||||
|
||||
'list of strings'
|
||||
See below.
|
||||
|
||||
None of the string values may be Unicode.
|
||||
|
||||
Encoding the version information is an art in itself. Python packages generally
|
||||
adhere to the version format *major.minor[.patch][sub]*. The major number is 0
|
||||
for initial, experimental releases of software. It is incremented for releases
|
||||
that represent major milestones in a package. The minor number is incremented
|
||||
when important new features are added to the package. The patch number
|
||||
increments when bug-fix releases are made. Additional trailing version
|
||||
information is sometimes used to indicate sub-releases. These are
|
||||
"a1,a2,...,aN" (for alpha releases, where functionality and API may change),
|
||||
"b1,b2,...,bN" (for beta releases, which only fix bugs) and "pr1,pr2,...,prN"
|
||||
(for final pre-release release testing). Some examples:
|
||||
|
||||
0.1.0
|
||||
the first, experimental release of a package
|
||||
|
||||
1.0.1a2
|
||||
the second alpha release of the first patch version of 1.0
|
||||
|
||||
:option:`classifiers` are specified in a python list::
|
||||
|
||||
setup(...
|
||||
classifiers=[
|
||||
'Development Status :: 4 - Beta',
|
||||
'Environment :: Console',
|
||||
'Environment :: Web Environment',
|
||||
'Intended Audience :: End Users/Desktop',
|
||||
'Intended Audience :: Developers',
|
||||
'Intended Audience :: System Administrators',
|
||||
'License :: OSI Approved :: Python Software Foundation License',
|
||||
'Operating System :: MacOS :: MacOS X',
|
||||
'Operating System :: Microsoft :: Windows',
|
||||
'Operating System :: POSIX',
|
||||
'Programming Language :: Python',
|
||||
'Topic :: Communications :: Email',
|
||||
'Topic :: Office/Business',
|
||||
'Topic :: Software Development :: Bug Tracking',
|
||||
],
|
||||
)
|
||||
|
||||
If you wish to include classifiers in your :file:`setup.py` file and also wish
|
||||
to remain backwards-compatible with Python releases prior to 2.2.3, then you can
|
||||
include the following code fragment in your :file:`setup.py` before the
|
||||
:func:`setup` call. ::
|
||||
|
||||
# patch distutils if it can't cope with the "classifiers" or
|
||||
# "download_url" keywords
|
||||
from sys import version
|
||||
if version < '2.2.3':
|
||||
from distutils.dist import DistributionMetadata
|
||||
DistributionMetadata.classifiers = None
|
||||
DistributionMetadata.download_url = None
|
||||
|
||||
|
||||
Debugging the setup script
|
||||
==========================
|
||||
|
||||
Sometimes things go wrong, and the setup script doesn't do what the developer
|
||||
wants.
|
||||
|
||||
Distutils catches any exceptions when running the setup script, and print a
|
||||
simple error message before the script is terminated. The motivation for this
|
||||
behaviour is to not confuse administrators who don't know much about Python and
|
||||
are trying to install a package. If they get a big long traceback from deep
|
||||
inside the guts of Distutils, they may think the package or the Python
|
||||
installation is broken because they don't read all the way down to the bottom
|
||||
and see that it's a permission problem.
|
||||
|
||||
On the other hand, this doesn't help the developer to find the cause of the
|
||||
failure. For this purpose, the DISTUTILS_DEBUG environment variable can be set
|
||||
to anything except an empty string, and distutils will now print detailed
|
||||
information what it is doing, and prints the full traceback in case an exception
|
||||
occurs.
|
||||
|
||||
|
||||
207
Doc-26/distutils/sourcedist.rst
Normal file
207
Doc-26/distutils/sourcedist.rst
Normal file
@@ -0,0 +1,207 @@
|
||||
.. _source-dist:
|
||||
|
||||
******************************
|
||||
Creating a Source Distribution
|
||||
******************************
|
||||
|
||||
As shown in section :ref:`simple-example`, you use the :command:`sdist` command
|
||||
to create a source distribution. In the simplest case, ::
|
||||
|
||||
python setup.py sdist
|
||||
|
||||
(assuming you haven't specified any :command:`sdist` options in the setup script
|
||||
or config file), :command:`sdist` creates the archive of the default format for
|
||||
the current platform. The default format is a gzip'ed tar file
|
||||
(:file:`.tar.gz`) on Unix, and ZIP file on Windows.
|
||||
|
||||
You can specify as many formats as you like using the :option:`--formats`
|
||||
option, for example::
|
||||
|
||||
python setup.py sdist --formats=gztar,zip
|
||||
|
||||
to create a gzipped tarball and a zip file. The available formats are:
|
||||
|
||||
+-----------+-------------------------+---------+
|
||||
| Format | Description | Notes |
|
||||
+===========+=========================+=========+
|
||||
| ``zip`` | zip file (:file:`.zip`) | (1),(3) |
|
||||
+-----------+-------------------------+---------+
|
||||
| ``gztar`` | gzip'ed tar file | (2),(4) |
|
||||
| | (:file:`.tar.gz`) | |
|
||||
+-----------+-------------------------+---------+
|
||||
| ``bztar`` | bzip2'ed tar file | \(4) |
|
||||
| | (:file:`.tar.bz2`) | |
|
||||
+-----------+-------------------------+---------+
|
||||
| ``ztar`` | compressed tar file | \(4) |
|
||||
| | (:file:`.tar.Z`) | |
|
||||
+-----------+-------------------------+---------+
|
||||
| ``tar`` | tar file (:file:`.tar`) | \(4) |
|
||||
+-----------+-------------------------+---------+
|
||||
|
||||
Notes:
|
||||
|
||||
(1)
|
||||
default on Windows
|
||||
|
||||
(2)
|
||||
default on Unix
|
||||
|
||||
(3)
|
||||
requires either external :program:`zip` utility or :mod:`zipfile` module (part
|
||||
of the standard Python library since Python 1.6)
|
||||
|
||||
(4)
|
||||
requires external utilities: :program:`tar` and possibly one of :program:`gzip`,
|
||||
:program:`bzip2`, or :program:`compress`
|
||||
|
||||
|
||||
.. _manifest:
|
||||
|
||||
Specifying the files to distribute
|
||||
==================================
|
||||
|
||||
If you don't supply an explicit list of files (or instructions on how to
|
||||
generate one), the :command:`sdist` command puts a minimal default set into the
|
||||
source distribution:
|
||||
|
||||
* all Python source files implied by the :option:`py_modules` and
|
||||
:option:`packages` options
|
||||
|
||||
* all C source files mentioned in the :option:`ext_modules` or
|
||||
:option:`libraries` options (
|
||||
|
||||
**\*\*** getting C library sources currently broken---no
|
||||
:meth:`get_source_files` method in :file:`build_clib.py`! **\*\***)
|
||||
|
||||
* scripts identified by the :option:`scripts` option
|
||||
|
||||
* anything that looks like a test script: :file:`test/test\*.py` (currently, the
|
||||
Distutils don't do anything with test scripts except include them in source
|
||||
distributions, but in the future there will be a standard for testing Python
|
||||
module distributions)
|
||||
|
||||
* :file:`README.txt` (or :file:`README`), :file:`setup.py` (or whatever you
|
||||
called your setup script), and :file:`setup.cfg`
|
||||
|
||||
Sometimes this is enough, but usually you will want to specify additional files
|
||||
to distribute. The typical way to do this is to write a *manifest template*,
|
||||
called :file:`MANIFEST.in` by default. The manifest template is just a list of
|
||||
instructions for how to generate your manifest file, :file:`MANIFEST`, which is
|
||||
the exact list of files to include in your source distribution. The
|
||||
:command:`sdist` command processes this template and generates a manifest based
|
||||
on its instructions and what it finds in the filesystem.
|
||||
|
||||
If you prefer to roll your own manifest file, the format is simple: one filename
|
||||
per line, regular files (or symlinks to them) only. If you do supply your own
|
||||
:file:`MANIFEST`, you must specify everything: the default set of files
|
||||
described above does not apply in this case.
|
||||
|
||||
The manifest template has one command per line, where each command specifies a
|
||||
set of files to include or exclude from the source distribution. For an
|
||||
example, again we turn to the Distutils' own manifest template::
|
||||
|
||||
include *.txt
|
||||
recursive-include examples *.txt *.py
|
||||
prune examples/sample?/build
|
||||
|
||||
The meanings should be fairly clear: include all files in the distribution root
|
||||
matching :file:`\*.txt`, all files anywhere under the :file:`examples` directory
|
||||
matching :file:`\*.txt` or :file:`\*.py`, and exclude all directories matching
|
||||
:file:`examples/sample?/build`. All of this is done *after* the standard
|
||||
include set, so you can exclude files from the standard set with explicit
|
||||
instructions in the manifest template. (Or, you can use the
|
||||
:option:`--no-defaults` option to disable the standard set entirely.) There are
|
||||
several other commands available in the manifest template mini-language; see
|
||||
section :ref:`sdist-cmd`.
|
||||
|
||||
The order of commands in the manifest template matters: initially, we have the
|
||||
list of default files as described above, and each command in the template adds
|
||||
to or removes from that list of files. Once we have fully processed the
|
||||
manifest template, we remove files that should not be included in the source
|
||||
distribution:
|
||||
|
||||
* all files in the Distutils "build" tree (default :file:`build/`)
|
||||
|
||||
* all files in directories named :file:`RCS`, :file:`CVS` or :file:`.svn`
|
||||
|
||||
Now we have our complete list of files, which is written to the manifest for
|
||||
future reference, and then used to build the source distribution archive(s).
|
||||
|
||||
You can disable the default set of included files with the
|
||||
:option:`--no-defaults` option, and you can disable the standard exclude set
|
||||
with :option:`--no-prune`.
|
||||
|
||||
Following the Distutils' own manifest template, let's trace how the
|
||||
:command:`sdist` command builds the list of files to include in the Distutils
|
||||
source distribution:
|
||||
|
||||
#. include all Python source files in the :file:`distutils` and
|
||||
:file:`distutils/command` subdirectories (because packages corresponding to
|
||||
those two directories were mentioned in the :option:`packages` option in the
|
||||
setup script---see section :ref:`setup-script`)
|
||||
|
||||
#. include :file:`README.txt`, :file:`setup.py`, and :file:`setup.cfg` (standard
|
||||
files)
|
||||
|
||||
#. include :file:`test/test\*.py` (standard files)
|
||||
|
||||
#. include :file:`\*.txt` in the distribution root (this will find
|
||||
:file:`README.txt` a second time, but such redundancies are weeded out later)
|
||||
|
||||
#. include anything matching :file:`\*.txt` or :file:`\*.py` in the sub-tree
|
||||
under :file:`examples`,
|
||||
|
||||
#. exclude all files in the sub-trees starting at directories matching
|
||||
:file:`examples/sample?/build`\ ---this may exclude files included by the
|
||||
previous two steps, so it's important that the ``prune`` command in the manifest
|
||||
template comes after the ``recursive-include`` command
|
||||
|
||||
#. exclude the entire :file:`build` tree, and any :file:`RCS`, :file:`CVS` and
|
||||
:file:`.svn` directories
|
||||
|
||||
Just like in the setup script, file and directory names in the manifest template
|
||||
should always be slash-separated; the Distutils will take care of converting
|
||||
them to the standard representation on your platform. That way, the manifest
|
||||
template is portable across operating systems.
|
||||
|
||||
|
||||
.. _manifest-options:
|
||||
|
||||
Manifest-related options
|
||||
========================
|
||||
|
||||
The normal course of operations for the :command:`sdist` command is as follows:
|
||||
|
||||
* if the manifest file, :file:`MANIFEST` doesn't exist, read :file:`MANIFEST.in`
|
||||
and create the manifest
|
||||
|
||||
* if neither :file:`MANIFEST` nor :file:`MANIFEST.in` exist, create a manifest
|
||||
with just the default file set
|
||||
|
||||
* if either :file:`MANIFEST.in` or the setup script (:file:`setup.py`) are more
|
||||
recent than :file:`MANIFEST`, recreate :file:`MANIFEST` by reading
|
||||
:file:`MANIFEST.in`
|
||||
|
||||
* use the list of files now in :file:`MANIFEST` (either just generated or read
|
||||
in) to create the source distribution archive(s)
|
||||
|
||||
There are a couple of options that modify this behaviour. First, use the
|
||||
:option:`--no-defaults` and :option:`--no-prune` to disable the standard
|
||||
"include" and "exclude" sets.
|
||||
|
||||
Second, you might want to force the manifest to be regenerated---for example, if
|
||||
you have added or removed files or directories that match an existing pattern in
|
||||
the manifest template, you should regenerate the manifest::
|
||||
|
||||
python setup.py sdist --force-manifest
|
||||
|
||||
Or, you might just want to (re)generate the manifest, but not create a source
|
||||
distribution::
|
||||
|
||||
python setup.py sdist --manifest-only
|
||||
|
||||
:option:`--manifest-only` implies :option:`--force-manifest`. :option:`-o` is a
|
||||
shortcut for :option:`--manifest-only`, and :option:`-f` for
|
||||
:option:`--force-manifest`.
|
||||
|
||||
|
||||
112
Doc-26/distutils/sysconfig.rst
Normal file
112
Doc-26/distutils/sysconfig.rst
Normal file
@@ -0,0 +1,112 @@
|
||||
|
||||
:mod:`distutils.sysconfig` --- System configuration information
|
||||
===============================================================
|
||||
|
||||
.. module:: distutils.sysconfig
|
||||
:synopsis: Low-level access to configuration information of the Python interpreter.
|
||||
.. moduleauthor:: Fred L. Drake, Jr. <fdrake@acm.org>
|
||||
.. moduleauthor:: Greg Ward <gward@python.net>
|
||||
.. sectionauthor:: Fred L. Drake, Jr. <fdrake@acm.org>
|
||||
|
||||
|
||||
The :mod:`distutils.sysconfig` module provides access to Python's low-level
|
||||
configuration information. The specific configuration variables available
|
||||
depend heavily on the platform and configuration. The specific variables depend
|
||||
on the build process for the specific version of Python being run; the variables
|
||||
are those found in the :file:`Makefile` and configuration header that are
|
||||
installed with Python on Unix systems. The configuration header is called
|
||||
:file:`pyconfig.h` for Python versions starting with 2.2, and :file:`config.h`
|
||||
for earlier versions of Python.
|
||||
|
||||
Some additional functions are provided which perform some useful manipulations
|
||||
for other parts of the :mod:`distutils` package.
|
||||
|
||||
|
||||
.. data:: PREFIX
|
||||
|
||||
The result of ``os.path.normpath(sys.prefix)``.
|
||||
|
||||
|
||||
.. data:: EXEC_PREFIX
|
||||
|
||||
The result of ``os.path.normpath(sys.exec_prefix)``.
|
||||
|
||||
|
||||
.. function:: get_config_var(name)
|
||||
|
||||
Return the value of a single variable. This is equivalent to
|
||||
``get_config_vars().get(name)``.
|
||||
|
||||
|
||||
.. function:: get_config_vars(...)
|
||||
|
||||
Return a set of variable definitions. If there are no arguments, this returns a
|
||||
dictionary mapping names of configuration variables to values. If arguments are
|
||||
provided, they should be strings, and the return value will be a sequence giving
|
||||
the associated values. If a given name does not have a corresponding value,
|
||||
``None`` will be included for that variable.
|
||||
|
||||
|
||||
.. function:: get_config_h_filename()
|
||||
|
||||
Return the full path name of the configuration header. For Unix, this will be
|
||||
the header generated by the :program:`configure` script; for other platforms the
|
||||
header will have been supplied directly by the Python source distribution. The
|
||||
file is a platform-specific text file.
|
||||
|
||||
|
||||
.. function:: get_makefile_filename()
|
||||
|
||||
Return the full path name of the :file:`Makefile` used to build Python. For
|
||||
Unix, this will be a file generated by the :program:`configure` script; the
|
||||
meaning for other platforms will vary. The file is a platform-specific text
|
||||
file, if it exists. This function is only useful on POSIX platforms.
|
||||
|
||||
|
||||
.. function:: get_python_inc([plat_specific[, prefix]])
|
||||
|
||||
Return the directory for either the general or platform-dependent C include
|
||||
files. If *plat_specific* is true, the platform-dependent include directory is
|
||||
returned; if false or omitted, the platform-independent directory is returned.
|
||||
If *prefix* is given, it is used as either the prefix instead of
|
||||
:const:`PREFIX`, or as the exec-prefix instead of :const:`EXEC_PREFIX` if
|
||||
*plat_specific* is true.
|
||||
|
||||
|
||||
.. function:: get_python_lib([plat_specific[, standard_lib[, prefix]]])
|
||||
|
||||
Return the directory for either the general or platform-dependent library
|
||||
installation. If *plat_specific* is true, the platform-dependent include
|
||||
directory is returned; if false or omitted, the platform-independent directory
|
||||
is returned. If *prefix* is given, it is used as either the prefix instead of
|
||||
:const:`PREFIX`, or as the exec-prefix instead of :const:`EXEC_PREFIX` if
|
||||
*plat_specific* is true. If *standard_lib* is true, the directory for the
|
||||
standard library is returned rather than the directory for the installation of
|
||||
third-party extensions.
|
||||
|
||||
The following function is only intended for use within the :mod:`distutils`
|
||||
package.
|
||||
|
||||
|
||||
.. function:: customize_compiler(compiler)
|
||||
|
||||
Do any platform-specific customization of a
|
||||
:class:`distutils.ccompiler.CCompiler` instance.
|
||||
|
||||
This function is only needed on Unix at this time, but should be called
|
||||
consistently to support forward-compatibility. It inserts the information that
|
||||
varies across Unix flavors and is stored in Python's :file:`Makefile`. This
|
||||
information includes the selected compiler, compiler and linker options, and the
|
||||
extension used by the linker for shared objects.
|
||||
|
||||
This function is even more special-purpose, and should only be used from
|
||||
Python's own build procedures.
|
||||
|
||||
|
||||
.. function:: set_python_build()
|
||||
|
||||
Inform the :mod:`distutils.sysconfig` module that it is being used as part of
|
||||
the build process for Python. This changes a lot of relative locations for
|
||||
files, allowing them to be located in the build area rather than in an installed
|
||||
Python.
|
||||
|
||||
37
Doc-26/distutils/uploading.rst
Normal file
37
Doc-26/distutils/uploading.rst
Normal file
@@ -0,0 +1,37 @@
|
||||
.. _package-upload:
|
||||
|
||||
***************************************
|
||||
Uploading Packages to the Package Index
|
||||
***************************************
|
||||
|
||||
.. versionadded:: 2.5
|
||||
|
||||
The Python Package Index (PyPI) not only stores the package info, but also the
|
||||
package data if the author of the package wishes to. The distutils command
|
||||
:command:`upload` pushes the distribution files to PyPI.
|
||||
|
||||
The command is invoked immediately after building one or more distribution
|
||||
files. For example, the command ::
|
||||
|
||||
python setup.py sdist bdist_wininst upload
|
||||
|
||||
will cause the source distribution and the Windows installer to be uploaded to
|
||||
PyPI. Note that these will be uploaded even if they are built using an earlier
|
||||
invocation of :file:`setup.py`, but that only distributions named on the command
|
||||
line for the invocation including the :command:`upload` command are uploaded.
|
||||
|
||||
The :command:`upload` command uses the username, password, and repository URL
|
||||
from the :file:`$HOME/.pypirc` file (see section :ref:`pypirc` for more on this
|
||||
file).
|
||||
|
||||
You can use the :option:`--sign` option to tell :command:`upload` to sign each
|
||||
uploaded file using GPG (GNU Privacy Guard). The :program:`gpg` program must
|
||||
be available for execution on the system :envvar:`PATH`. You can also specify
|
||||
which key to use for signing using the :option:`--identity=*name*` option.
|
||||
|
||||
Other :command:`upload` options include :option:`--repository=*url*` (which
|
||||
lets you override the repository setting from :file:`$HOME/.pypirc`), and
|
||||
:option:`--show-response` (which displays the full response text from the PyPI
|
||||
server for help in debugging upload problems).
|
||||
|
||||
|
||||
33
Doc-26/documenting/index.rst
Normal file
33
Doc-26/documenting/index.rst
Normal file
@@ -0,0 +1,33 @@
|
||||
.. _documenting-index:
|
||||
|
||||
######################
|
||||
Documenting Python
|
||||
######################
|
||||
|
||||
|
||||
The Python language has a substantial body of documentation, much of it
|
||||
contributed by various authors. The markup used for the Python documentation is
|
||||
`reStructuredText`_, developed by the `docutils`_ project, amended by custom
|
||||
directives and using a toolset named *Sphinx* to postprocess the HTML output.
|
||||
|
||||
This document describes the style guide for our documentation, the custom
|
||||
reStructuredText markup introduced to support Python documentation and how it
|
||||
should be used, as well as the Sphinx build system.
|
||||
|
||||
.. _reStructuredText: http://docutils.sf.net/rst.html
|
||||
.. _docutils: http://docutils.sf.net/
|
||||
|
||||
If you're interested in contributing to Python's documentation, there's no need
|
||||
to write reStructuredText if you're not so inclined; plain text contributions
|
||||
are more than welcome as well.
|
||||
|
||||
.. toctree::
|
||||
|
||||
intro.rst
|
||||
style.rst
|
||||
rest.rst
|
||||
markup.rst
|
||||
sphinx.rst
|
||||
|
||||
.. XXX add credits, thanks etc.
|
||||
|
||||
29
Doc-26/documenting/intro.rst
Normal file
29
Doc-26/documenting/intro.rst
Normal file
@@ -0,0 +1,29 @@
|
||||
Introduction
|
||||
============
|
||||
|
||||
Python's documentation has long been considered to be good for a free
|
||||
programming language. There are a number of reasons for this, the most
|
||||
important being the early commitment of Python's creator, Guido van Rossum, to
|
||||
providing documentation on the language and its libraries, and the continuing
|
||||
involvement of the user community in providing assistance for creating and
|
||||
maintaining documentation.
|
||||
|
||||
The involvement of the community takes many forms, from authoring to bug reports
|
||||
to just plain complaining when the documentation could be more complete or
|
||||
easier to use.
|
||||
|
||||
This document is aimed at authors and potential authors of documentation for
|
||||
Python. More specifically, it is for people contributing to the standard
|
||||
documentation and developing additional documents using the same tools as the
|
||||
standard documents. This guide will be less useful for authors using the Python
|
||||
documentation tools for topics other than Python, and less useful still for
|
||||
authors not using the tools at all.
|
||||
|
||||
If your interest is in contributing to the Python documentation, but you don't
|
||||
have the time or inclination to learn reStructuredText and the markup structures
|
||||
documented here, there's a welcoming place for you among the Python contributors
|
||||
as well. Any time you feel that you can clarify existing documentation or
|
||||
provide documentation that's missing, the existing documentation team will
|
||||
gladly work with you to integrate your text, dealing with the markup for you.
|
||||
Please don't let the material in this document stand between the documentation
|
||||
and your desire to help out!
|
||||
742
Doc-26/documenting/markup.rst
Normal file
742
Doc-26/documenting/markup.rst
Normal file
@@ -0,0 +1,742 @@
|
||||
.. highlightlang:: rest
|
||||
|
||||
Additional Markup Constructs
|
||||
============================
|
||||
|
||||
Sphinx adds a lot of new directives and interpreted text roles to standard reST
|
||||
markup. This section contains the reference material for these facilities.
|
||||
Documentation for "standard" reST constructs is not included here, though
|
||||
they are used in the Python documentation.
|
||||
|
||||
XXX: file-wide metadata
|
||||
|
||||
Meta-information markup
|
||||
-----------------------
|
||||
|
||||
.. describe:: sectionauthor
|
||||
|
||||
Identifies the author of the current section. The argument should include
|
||||
the author's name such that it can be used for presentation (though it isn't)
|
||||
and email address. The domain name portion of the address should be lower
|
||||
case. Example::
|
||||
|
||||
.. sectionauthor:: Guido van Rossum <guido@python.org>
|
||||
|
||||
Currently, this markup isn't reflected in the output in any way, but it helps
|
||||
keep track of contributions.
|
||||
|
||||
|
||||
Module-specific markup
|
||||
----------------------
|
||||
|
||||
The markup described in this section is used to provide information about a
|
||||
module being documented. Each module should be documented in its own file.
|
||||
Normally this markup appears after the title heading of that file; a typical
|
||||
file might start like this::
|
||||
|
||||
:mod:`parrot` -- Dead parrot access
|
||||
===================================
|
||||
|
||||
.. module:: parrot
|
||||
:platform: Unix, Windows
|
||||
:synopsis: Analyze and reanimate dead parrots.
|
||||
.. moduleauthor:: Eric Cleese <eric@python.invalid>
|
||||
.. moduleauthor:: John Idle <john@python.invalid>
|
||||
|
||||
As you can see, the module-specific markup consists of two directives, the
|
||||
``module`` directive and the ``moduleauthor`` directive.
|
||||
|
||||
.. describe:: module
|
||||
|
||||
This directive marks the beginning of the description of a module (or package
|
||||
submodule, in which case the name should be fully qualified, including the
|
||||
package name).
|
||||
|
||||
The ``platform`` option, if present, is a comma-separated list of the
|
||||
platforms on which the module is available (if it is available on all
|
||||
platforms, the option should be omitted). The keys are short identifiers;
|
||||
examples that are in use include "IRIX", "Mac", "Windows", and "Unix". It is
|
||||
important to use a key which has already been used when applicable.
|
||||
|
||||
The ``synopsis`` option should consist of one sentence describing the
|
||||
module's purpose -- it is currently only used in the Global Module Index.
|
||||
|
||||
.. describe:: moduleauthor
|
||||
|
||||
The ``moduleauthor`` directive, which can appear multiple times, names the
|
||||
authors of the module code, just like ``sectionauthor`` names the author(s)
|
||||
of a piece of documentation. It too does not result in any output currently.
|
||||
|
||||
|
||||
.. note::
|
||||
|
||||
It is important to make the section title of a module-describing file
|
||||
meaningful since that value will be inserted in the table-of-contents trees
|
||||
in overview files.
|
||||
|
||||
|
||||
Information units
|
||||
-----------------
|
||||
|
||||
There are a number of directives used to describe specific features provided by
|
||||
modules. Each directive requires one or more signatures to provide basic
|
||||
information about what is being described, and the content should be the
|
||||
description. The basic version makes entries in the general index; if no index
|
||||
entry is desired, you can give the directive option flag ``:noindex:``. The
|
||||
following example shows all of the features of this directive type::
|
||||
|
||||
.. function:: spam(eggs)
|
||||
ham(eggs)
|
||||
:noindex:
|
||||
|
||||
Spam or ham the foo.
|
||||
|
||||
The signatures of object methods or data attributes should always include the
|
||||
type name (``.. method:: FileInput.input(...)``), even if it is obvious from the
|
||||
context which type they belong to; this is to enable consistent
|
||||
cross-references. If you describe methods belonging to an abstract protocol,
|
||||
such as "context managers", include a (pseudo-)type name too to make the
|
||||
index entries more informative.
|
||||
|
||||
The directives are:
|
||||
|
||||
.. describe:: cfunction
|
||||
|
||||
Describes a C function. The signature should be given as in C, e.g.::
|
||||
|
||||
.. cfunction:: PyObject* PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
|
||||
|
||||
This is also used to describe function-like preprocessor macros. The names
|
||||
of the arguments should be given so they may be used in the description.
|
||||
|
||||
Note that you don't have to backslash-escape asterisks in the signature,
|
||||
as it is not parsed by the reST inliner.
|
||||
|
||||
.. describe:: cmember
|
||||
|
||||
Describes a C struct member. Example signature::
|
||||
|
||||
.. cmember:: PyObject* PyTypeObject.tp_bases
|
||||
|
||||
The text of the description should include the range of values allowed, how
|
||||
the value should be interpreted, and whether the value can be changed.
|
||||
References to structure members in text should use the ``member`` role.
|
||||
|
||||
.. describe:: cmacro
|
||||
|
||||
Describes a "simple" C macro. Simple macros are macros which are used
|
||||
for code expansion, but which do not take arguments so cannot be described as
|
||||
functions. This is not to be used for simple constant definitions. Examples
|
||||
of its use in the Python documentation include :cmacro:`PyObject_HEAD` and
|
||||
:cmacro:`Py_BEGIN_ALLOW_THREADS`.
|
||||
|
||||
.. describe:: ctype
|
||||
|
||||
Describes a C type. The signature should just be the type name.
|
||||
|
||||
.. describe:: cvar
|
||||
|
||||
Describes a global C variable. The signature should include the type, such
|
||||
as::
|
||||
|
||||
.. cvar:: PyObject* PyClass_Type
|
||||
|
||||
.. describe:: data
|
||||
|
||||
Describes global data in a module, including both variables and values used
|
||||
as "defined constants." Class and object attributes are not documented
|
||||
using this environment.
|
||||
|
||||
.. describe:: exception
|
||||
|
||||
Describes an exception class. The signature can, but need not include
|
||||
parentheses with constructor arguments.
|
||||
|
||||
.. describe:: function
|
||||
|
||||
Describes a module-level function. The signature should include the
|
||||
parameters, enclosing optional parameters in brackets. Default values can be
|
||||
given if it enhances clarity. For example::
|
||||
|
||||
.. function:: Timer.repeat([repeat=3[, number=1000000]])
|
||||
|
||||
Object methods are not documented using this directive. Bound object methods
|
||||
placed in the module namespace as part of the public interface of the module
|
||||
are documented using this, as they are equivalent to normal functions for
|
||||
most purposes.
|
||||
|
||||
The description should include information about the parameters required and
|
||||
how they are used (especially whether mutable objects passed as parameters
|
||||
are modified), side effects, and possible exceptions. A small example may be
|
||||
provided.
|
||||
|
||||
.. describe:: class
|
||||
|
||||
Describes a class. The signature can include parentheses with parameters
|
||||
which will be shown as the constructor arguments.
|
||||
|
||||
.. describe:: attribute
|
||||
|
||||
Describes an object data attribute. The description should include
|
||||
information about the type of the data to be expected and whether it may be
|
||||
changed directly.
|
||||
|
||||
.. describe:: method
|
||||
|
||||
Describes an object method. The parameters should not include the ``self``
|
||||
parameter. The description should include similar information to that
|
||||
described for ``function``.
|
||||
|
||||
.. describe:: opcode
|
||||
|
||||
Describes a Python bytecode instruction.
|
||||
|
||||
|
||||
There is also a generic version of these directives:
|
||||
|
||||
.. describe:: describe
|
||||
|
||||
This directive produces the same formatting as the specific ones explained
|
||||
above but does not create index entries or cross-referencing targets. It is
|
||||
used, for example, to describe the directives in this document. Example::
|
||||
|
||||
.. describe:: opcode
|
||||
|
||||
Describes a Python bytecode instruction.
|
||||
|
||||
|
||||
Showing code examples
|
||||
---------------------
|
||||
|
||||
Examples of Python source code or interactive sessions are represented using
|
||||
standard reST literal blocks. They are started by a ``::`` at the end of the
|
||||
preceding paragraph and delimited by indentation.
|
||||
|
||||
Representing an interactive session requires including the prompts and output
|
||||
along with the Python code. No special markup is required for interactive
|
||||
sessions. After the last line of input or output presented, there should not be
|
||||
an "unused" primary prompt; this is an example of what *not* to do::
|
||||
|
||||
>>> 1 + 1
|
||||
2
|
||||
>>>
|
||||
|
||||
Syntax highlighting is handled in a smart way:
|
||||
|
||||
* There is a "highlighting language" for each source file. Per default,
|
||||
this is ``'python'`` as the majority of files will have to highlight Python
|
||||
snippets.
|
||||
|
||||
* Within Python highlighting mode, interactive sessions are recognized
|
||||
automatically and highlighted appropriately.
|
||||
|
||||
* The highlighting language can be changed using the ``highlightlang``
|
||||
directive, used as follows::
|
||||
|
||||
.. highlightlang:: c
|
||||
|
||||
This language is used until the next ``highlightlang`` directive is
|
||||
encountered.
|
||||
|
||||
* The valid values for the highlighting language are:
|
||||
|
||||
* ``python`` (the default)
|
||||
* ``c``
|
||||
* ``rest``
|
||||
* ``none`` (no highlighting)
|
||||
|
||||
* If highlighting with the current language fails, the block is not highlighted
|
||||
in any way.
|
||||
|
||||
Longer displays of verbatim text may be included by storing the example text in
|
||||
an external file containing only plain text. The file may be included using the
|
||||
standard ``include`` directive with the ``literal`` option flag. For example,
|
||||
to include the Python source file :file:`example.py`, use::
|
||||
|
||||
.. include:: example.py
|
||||
:literal:
|
||||
|
||||
|
||||
Inline markup
|
||||
-------------
|
||||
|
||||
As said before, Sphinx uses interpreted text roles to insert semantic markup in
|
||||
documents.
|
||||
|
||||
The default role is ``var``, as that was one of the most common macros used in
|
||||
the old LaTeX docs. That means that you can use ```var``` to refer to a
|
||||
variable named "var".
|
||||
|
||||
For all other roles, you have to write ``:rolename:`content```.
|
||||
|
||||
The following roles refer to objects in modules and are possibly hyperlinked if
|
||||
a matching identifier is found:
|
||||
|
||||
.. describe:: mod
|
||||
|
||||
The name of a module; a dotted name may be used. This should also be used for
|
||||
package names.
|
||||
|
||||
.. describe:: func
|
||||
|
||||
The name of a Python function; dotted names may be used. The role text
|
||||
should include trailing parentheses to enhance readability. The parentheses
|
||||
are stripped when searching for identifiers.
|
||||
|
||||
.. describe:: data
|
||||
|
||||
The name of a module-level variable.
|
||||
|
||||
.. describe:: const
|
||||
|
||||
The name of a "defined" constant. This may be a C-language ``#define``
|
||||
or a Python variable that is not intended to be changed.
|
||||
|
||||
.. describe:: class
|
||||
|
||||
A class name; a dotted name may be used.
|
||||
|
||||
.. describe:: meth
|
||||
|
||||
The name of a method of an object. The role text should include the type
|
||||
name, method name and the trailing parentheses. A dotted name may be used.
|
||||
|
||||
.. describe:: attr
|
||||
|
||||
The name of a data attribute of an object.
|
||||
|
||||
.. describe:: exc
|
||||
|
||||
The name of an exception. A dotted name may be used.
|
||||
|
||||
The name enclosed in this markup can include a module name and/or a class name.
|
||||
For example, ``:func:`filter``` could refer to a function named ``filter`` in
|
||||
the current module, or the built-in function of that name. In contrast,
|
||||
``:func:`foo.filter``` clearly refers to the ``filter`` function in the ``foo``
|
||||
module.
|
||||
|
||||
A similar heuristic is used to determine whether the name is an attribute of
|
||||
the currently documented class.
|
||||
|
||||
The following roles create cross-references to C-language constructs if they
|
||||
are defined in the API documentation:
|
||||
|
||||
.. describe:: cdata
|
||||
|
||||
The name of a C-language variable.
|
||||
|
||||
.. describe:: cfunc
|
||||
|
||||
The name of a C-language function. Should include trailing parentheses.
|
||||
|
||||
.. describe:: cmacro
|
||||
|
||||
The name of a "simple" C macro, as defined above.
|
||||
|
||||
.. describe:: ctype
|
||||
|
||||
The name of a C-language type.
|
||||
|
||||
|
||||
The following role does possibly create a cross-reference, but does not refer
|
||||
to objects:
|
||||
|
||||
.. describe:: token
|
||||
|
||||
The name of a grammar token (used in the reference manual to create links
|
||||
between production displays).
|
||||
|
||||
---------
|
||||
|
||||
The following roles don't do anything special except formatting the text
|
||||
in a different style:
|
||||
|
||||
.. describe:: command
|
||||
|
||||
The name of an OS-level command, such as ``rm``.
|
||||
|
||||
.. describe:: dfn
|
||||
|
||||
Mark the defining instance of a term in the text. (No index entries are
|
||||
generated.)
|
||||
|
||||
.. describe:: envvar
|
||||
|
||||
An environment variable. Index entries are generated.
|
||||
|
||||
.. describe:: file
|
||||
|
||||
The name of a file or directory. Within the contents, you can use curly
|
||||
braces to indicate a "variable" part, for example::
|
||||
|
||||
... is installed in :file:`/usr/lib/python2.{x}/site-packages` ...
|
||||
|
||||
In the built documentation, the ``x`` will be displayed differently to
|
||||
indicate that it is to be replaced by the Python minor version.
|
||||
|
||||
.. describe:: guilabel
|
||||
|
||||
Labels presented as part of an interactive user interface should be marked
|
||||
using ``guilabel``. This includes labels from text-based interfaces such as
|
||||
those created using :mod:`curses` or other text-based libraries. Any label
|
||||
used in the interface should be marked with this role, including button
|
||||
labels, window titles, field names, menu and menu selection names, and even
|
||||
values in selection lists.
|
||||
|
||||
.. describe:: kbd
|
||||
|
||||
Mark a sequence of keystrokes. What form the key sequence takes may depend
|
||||
on platform- or application-specific conventions. When there are no relevant
|
||||
conventions, the names of modifier keys should be spelled out, to improve
|
||||
accessibility for new users and non-native speakers. For example, an
|
||||
*xemacs* key sequence may be marked like ``:kbd:`C-x C-f```, but without
|
||||
reference to a specific application or platform, the same sequence should be
|
||||
marked as ``:kbd:`Control-x Control-f```.
|
||||
|
||||
.. describe:: keyword
|
||||
|
||||
The name of a keyword in a programming language.
|
||||
|
||||
.. describe:: mailheader
|
||||
|
||||
The name of an RFC 822-style mail header. This markup does not imply that
|
||||
the header is being used in an email message, but can be used to refer to any
|
||||
header of the same "style." This is also used for headers defined by the
|
||||
various MIME specifications. The header name should be entered in the same
|
||||
way it would normally be found in practice, with the camel-casing conventions
|
||||
being preferred where there is more than one common usage. For example:
|
||||
``:mailheader:`Content-Type```.
|
||||
|
||||
.. describe:: makevar
|
||||
|
||||
The name of a :command:`make` variable.
|
||||
|
||||
.. describe:: manpage
|
||||
|
||||
A reference to a Unix manual page including the section,
|
||||
e.g. ``:manpage:`ls(1)```.
|
||||
|
||||
.. describe:: menuselection
|
||||
|
||||
Menu selections should be marked using the ``menuselection`` role. This is
|
||||
used to mark a complete sequence of menu selections, including selecting
|
||||
submenus and choosing a specific operation, or any subsequence of such a
|
||||
sequence. The names of individual selections should be separated by
|
||||
``-->``.
|
||||
|
||||
For example, to mark the selection "Start > Programs", use this markup::
|
||||
|
||||
:menuselection:`Start --> Programs`
|
||||
|
||||
When including a selection that includes some trailing indicator, such as the
|
||||
ellipsis some operating systems use to indicate that the command opens a
|
||||
dialog, the indicator should be omitted from the selection name.
|
||||
|
||||
.. describe:: mimetype
|
||||
|
||||
The name of a MIME type, or a component of a MIME type (the major or minor
|
||||
portion, taken alone).
|
||||
|
||||
.. describe:: newsgroup
|
||||
|
||||
The name of a Usenet newsgroup.
|
||||
|
||||
.. describe:: option
|
||||
|
||||
A command-line option to an executable program. The leading hyphen(s) must
|
||||
be included.
|
||||
|
||||
.. describe:: program
|
||||
|
||||
The name of an executable program. This may differ from the file name for
|
||||
the executable for some platforms. In particular, the ``.exe`` (or other)
|
||||
extension should be omitted for Windows programs.
|
||||
|
||||
.. describe:: regexp
|
||||
|
||||
A regular expression. Quotes should not be included.
|
||||
|
||||
.. describe:: var
|
||||
|
||||
A Python or C variable or parameter name.
|
||||
|
||||
|
||||
The following roles generate external links:
|
||||
|
||||
.. describe:: pep
|
||||
|
||||
A reference to a Python Enhancement Proposal. This generates appropriate
|
||||
index entries. The text "PEP *number*\ " is generated; in the HTML output,
|
||||
this text is a hyperlink to an online copy of the specified PEP.
|
||||
|
||||
.. describe:: rfc
|
||||
|
||||
A reference to an Internet Request for Comments. This generates appropriate
|
||||
index entries. The text "RFC *number*\ " is generated; in the HTML output,
|
||||
this text is a hyperlink to an online copy of the specified RFC.
|
||||
|
||||
|
||||
Note that there are no special roles for including hyperlinks as you can use
|
||||
the standard reST markup for that purpose.
|
||||
|
||||
|
||||
.. _doc-ref-role:
|
||||
|
||||
Cross-linking markup
|
||||
--------------------
|
||||
|
||||
To support cross-referencing to arbitrary sections in the documentation, the
|
||||
standard reST labels are "abused" a bit: Every label must precede a section
|
||||
title; and every label name must be unique throughout the entire documentation
|
||||
source.
|
||||
|
||||
You can then reference to these sections using the ``:ref:`label-name``` role.
|
||||
|
||||
Example::
|
||||
|
||||
.. _my-reference-label:
|
||||
|
||||
Section to cross-reference
|
||||
--------------------------
|
||||
|
||||
This is the text of the section.
|
||||
|
||||
It refers to the section itself, see :ref:`my-reference-label`.
|
||||
|
||||
The ``:ref:`` invocation is replaced with the section title.
|
||||
|
||||
|
||||
Paragraph-level markup
|
||||
----------------------
|
||||
|
||||
These directives create short paragraphs and can be used inside information
|
||||
units as well as normal text:
|
||||
|
||||
.. describe:: note
|
||||
|
||||
An especially important bit of information about an API that a user should be
|
||||
aware of when using whatever bit of API the note pertains to. The content of
|
||||
the directive should be written in complete sentences and include all
|
||||
appropriate punctuation.
|
||||
|
||||
Example::
|
||||
|
||||
.. note::
|
||||
|
||||
This function is not suitable for sending spam e-mails.
|
||||
|
||||
.. describe:: warning
|
||||
|
||||
An important bit of information about an API that a user should be very aware
|
||||
of when using whatever bit of API the warning pertains to. The content of
|
||||
the directive should be written in complete sentences and include all
|
||||
appropriate punctuation. This differs from ``note`` in that it is recommended
|
||||
over ``note`` for information regarding security.
|
||||
|
||||
.. describe:: versionadded
|
||||
|
||||
This directive documents the version of Python which added the described
|
||||
feature to the library or C API. When this applies to an entire module, it
|
||||
should be placed at the top of the module section before any prose.
|
||||
|
||||
The first argument must be given and is the version in question; you can add
|
||||
a second argument consisting of a *brief* explanation of the change.
|
||||
|
||||
Example::
|
||||
|
||||
.. versionadded:: 2.5
|
||||
The `spam` parameter.
|
||||
|
||||
Note that there must be no blank line between the directive head and the
|
||||
explanation; this is to make these blocks visually continuous in the markup.
|
||||
|
||||
.. describe:: versionchanged
|
||||
|
||||
Similar to ``versionadded``, but describes when and what changed in the named
|
||||
feature in some way (new parameters, changed side effects, etc.).
|
||||
|
||||
--------------
|
||||
|
||||
.. describe:: seealso
|
||||
|
||||
Many sections include a list of references to module documentation or
|
||||
external documents. These lists are created using the ``seealso`` directive.
|
||||
|
||||
The ``seealso`` directive is typically placed in a section just before any
|
||||
sub-sections. For the HTML output, it is shown boxed off from the main flow
|
||||
of the text.
|
||||
|
||||
The content of the ``seealso`` directive should be a reST definition list.
|
||||
Example::
|
||||
|
||||
.. seealso::
|
||||
|
||||
Module :mod:`zipfile`
|
||||
Documentation of the :mod:`zipfile` standard module.
|
||||
|
||||
`GNU tar manual, Basic Tar Format <http://link>`_
|
||||
Documentation for tar archive files, including GNU tar extensions.
|
||||
|
||||
.. describe:: rubric
|
||||
|
||||
This directive creates a paragraph heading that is not used to create a
|
||||
table of contents node. It is currently used for the "Footnotes" caption.
|
||||
|
||||
.. describe:: centered
|
||||
|
||||
This directive creates a centered boldfaced paragraph. Use it as follows::
|
||||
|
||||
.. centered::
|
||||
|
||||
Paragraph contents.
|
||||
|
||||
|
||||
Table-of-contents markup
|
||||
------------------------
|
||||
|
||||
Since reST does not have facilities to interconnect several documents, or split
|
||||
documents into multiple output files, Sphinx uses a custom directive to add
|
||||
relations between the single files the documentation is made of, as well as
|
||||
tables of contents. The ``toctree`` directive is the central element.
|
||||
|
||||
.. describe:: toctree
|
||||
|
||||
This directive inserts a "TOC tree" at the current location, using the
|
||||
individual TOCs (including "sub-TOC trees") of the files given in the
|
||||
directive body. A numeric ``maxdepth`` option may be given to indicate the
|
||||
depth of the tree; by default, all levels are included.
|
||||
|
||||
Consider this example (taken from the library reference index)::
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
intro.rst
|
||||
strings.rst
|
||||
datatypes.rst
|
||||
numeric.rst
|
||||
(many more files listed here)
|
||||
|
||||
This accomplishes two things:
|
||||
|
||||
* Tables of contents from all those files are inserted, with a maximum depth
|
||||
of two, that means one nested heading. ``toctree`` directives in those
|
||||
files are also taken into account.
|
||||
* Sphinx knows that the relative order of the files ``intro.rst``,
|
||||
``strings.rst`` and so forth, and it knows that they are children of the
|
||||
shown file, the library index. From this information it generates "next
|
||||
chapter", "previous chapter" and "parent chapter" links.
|
||||
|
||||
In the end, all files included in the build process must occur in one
|
||||
``toctree`` directive; Sphinx will emit a warning if it finds a file that is
|
||||
not included, because that means that this file will not be reachable through
|
||||
standard navigation.
|
||||
|
||||
The special file ``contents.rst`` at the root of the source directory is the
|
||||
"root" of the TOC tree hierarchy; from it the "Contents" page is generated.
|
||||
|
||||
|
||||
Index-generating markup
|
||||
-----------------------
|
||||
|
||||
Sphinx automatically creates index entries from all information units (like
|
||||
functions, classes or attributes) like discussed before.
|
||||
|
||||
However, there is also an explicit directive available, to make the index more
|
||||
comprehensive and enable index entries in documents where information is not
|
||||
mainly contained in information units, such as the language reference.
|
||||
|
||||
The directive is ``index`` and contains one or more index entries. Each entry
|
||||
consists of a type and a value, separated by a colon.
|
||||
|
||||
For example::
|
||||
|
||||
.. index::
|
||||
single: execution!context
|
||||
module: __main__
|
||||
module: sys
|
||||
triple: module; search; path
|
||||
|
||||
This directive contains five entries, which will be converted to entries in the
|
||||
generated index which link to the exact location of the index statement (or, in
|
||||
case of offline media, the corresponding page number).
|
||||
|
||||
The possible entry types are:
|
||||
|
||||
single
|
||||
Creates a single index entry. Can be made a subentry by separating the
|
||||
subentry text with a semicolon (this is also used below to describe what
|
||||
entries are created).
|
||||
pair
|
||||
``pair: loop; statement`` is a shortcut that creates two index entries,
|
||||
namely ``loop; statement`` and ``statement; loop``.
|
||||
triple
|
||||
Likewise, ``triple: module; search; path`` is a shortcut that creates three
|
||||
index entries, which are ``module; search path``, ``search; path, module`` and
|
||||
``path; module search``.
|
||||
module, keyword, operator, object, exception, statement, builtin
|
||||
These all create two index entries. For example, ``module: hashlib`` creates
|
||||
the entries ``module; hashlib`` and ``hashlib; module``.
|
||||
|
||||
|
||||
Grammar production displays
|
||||
---------------------------
|
||||
|
||||
Special markup is available for displaying the productions of a formal grammar.
|
||||
The markup is simple and does not attempt to model all aspects of BNF (or any
|
||||
derived forms), but provides enough to allow context-free grammars to be
|
||||
displayed in a way that causes uses of a symbol to be rendered as hyperlinks to
|
||||
the definition of the symbol. There is this directive:
|
||||
|
||||
.. describe:: productionlist
|
||||
|
||||
This directive is used to enclose a group of productions. Each production is
|
||||
given on a single line and consists of a name, separated by a colon from the
|
||||
following definition. If the definition spans multiple lines, each
|
||||
continuation line must begin with a colon placed at the same column as in the
|
||||
first line.
|
||||
|
||||
Blank lines are not allowed within ``productionlist`` directive arguments.
|
||||
|
||||
The definition can contain token names which are marked as interpreted text
|
||||
(e.g. ``sum ::= `integer` "+" `integer```) -- this generates cross-references
|
||||
to the productions of these tokens. Note that vertical bars used to indicate
|
||||
alternatives must be escaped with backslashes because otherwise they would
|
||||
indicate a substitution reference to the reST parser.
|
||||
|
||||
|
||||
.. XXX describe optional first parameter
|
||||
|
||||
The following is an example taken from the Python Reference Manual::
|
||||
|
||||
.. productionlist::
|
||||
try_stmt: try1_stmt \| try2_stmt
|
||||
try1_stmt: "try" ":" :token:`suite`
|
||||
: ("except" [:token:`expression` ["," :token:`target`]] ":" :token:`suite`)+
|
||||
: ["else" ":" :token:`suite`]
|
||||
: ["finally" ":" :token:`suite`]
|
||||
try2_stmt: "try" ":" :token:`suite`
|
||||
: "finally" ":" :token:`suite`
|
||||
|
||||
|
||||
Substitutions
|
||||
-------------
|
||||
|
||||
The documentation system provides three substitutions that are defined by default.
|
||||
They are set in the build configuration file, see :ref:`doc-build-config`.
|
||||
|
||||
.. describe:: |release|
|
||||
|
||||
Replaced by the Python release the documentation refers to. This is the full
|
||||
version string including alpha/beta/release candidate tags, e.g. ``2.5.2b3``.
|
||||
|
||||
.. describe:: |version|
|
||||
|
||||
Replaced by the Python version the documentation refers to. This consists
|
||||
only of the major and minor version parts, e.g. ``2.5``, even for version
|
||||
2.5.1.
|
||||
|
||||
.. describe:: |today|
|
||||
|
||||
Replaced by either today's date, or the date set in the build configuration
|
||||
file. Normally has the format ``April 14, 2007``.
|
||||
232
Doc-26/documenting/rest.rst
Normal file
232
Doc-26/documenting/rest.rst
Normal file
@@ -0,0 +1,232 @@
|
||||
.. highlightlang:: rest
|
||||
|
||||
reStructuredText Primer
|
||||
=======================
|
||||
|
||||
This section is a brief introduction to reStructuredText (reST) concepts and
|
||||
syntax, intended to provide authors with enough information to author
|
||||
documents productively.
|
||||
Since reST was designed to be a simple, unobtrusive markup language, this will
|
||||
not take too long.
|
||||
|
||||
.. seealso::
|
||||
|
||||
The authoritative `reStructuredText User
|
||||
Documentation <http://docutils.sourceforge.net/rst.html>`_.
|
||||
|
||||
|
||||
Paragraphs
|
||||
----------
|
||||
|
||||
The paragraph is the most basic block in a reST document.
|
||||
Paragraphs are simply chunks of text
|
||||
separated by one or more blank lines. As in Python, indentation is significant
|
||||
in reST, so all lines of the same paragraph must be left-aligned
|
||||
to the same level of indentation.
|
||||
|
||||
|
||||
Inline markup
|
||||
-------------
|
||||
|
||||
The standard reST inline markup is quite simple: use
|
||||
|
||||
* one asterisk: ``*text*`` for emphasis (italics),
|
||||
* two asterisks: ``**text**`` for strong emphasis (boldface), and
|
||||
* backquotes: ````text```` for code samples.
|
||||
|
||||
If asterisks or backquotes appear in running text and could be confused with
|
||||
inline markup delimiters, they have to be escaped with a backslash.
|
||||
|
||||
Be aware of some restrictions of this markup:
|
||||
|
||||
* it may not be nested,
|
||||
* content may not start or end with whitespace: ``* text*`` is wrong,
|
||||
* it must be separated from surrounding text by non-word characters. Use a
|
||||
backslash escaped space to work around that: ``thisis\ *one*\ word``.
|
||||
|
||||
These restrictions may be lifted in future versions of the docutils.
|
||||
|
||||
reST also allows for custom "interpreted text roles"', which signify that the
|
||||
enclosed text should be interpreted in a specific way. Sphinx uses this to
|
||||
provide semantic markup and cross-referencing of identifiers, as described in
|
||||
the appropriate section. The general syntax is ``:rolename:`content```.
|
||||
|
||||
|
||||
Lists and Quotes
|
||||
----------------
|
||||
|
||||
List markup is natural: just place an asterisk at the start of a paragraph and
|
||||
indent properly. The same goes for numbered lists; they can also be
|
||||
autonumbered using a ``#`` sign::
|
||||
|
||||
* This is a bulleted list.
|
||||
* It has two items, the second
|
||||
item uses two lines.
|
||||
|
||||
#. This is a numbered list.
|
||||
#. It has two items too.
|
||||
|
||||
Nested lists are possible, but be aware that they must be separated from the
|
||||
parent list items by blank lines::
|
||||
|
||||
* this is
|
||||
* a list
|
||||
|
||||
* with a nested list
|
||||
* and some subitems
|
||||
|
||||
* and here the parent list continues
|
||||
|
||||
Definition lists are created as follows::
|
||||
|
||||
term (up to a line of text)
|
||||
Definition of the term, which must be indented
|
||||
|
||||
and can even consist of multiple paragraphs
|
||||
|
||||
next term
|
||||
Description.
|
||||
|
||||
|
||||
Paragraphs are quoted by just indenting them more than the surrounding
|
||||
paragraphs.
|
||||
|
||||
|
||||
Source Code
|
||||
-----------
|
||||
|
||||
Literal code blocks are introduced by ending a paragraph with the special marker
|
||||
``::``. The literal block must be indented, to be able to include blank lines::
|
||||
|
||||
This is a normal text paragraph. The next paragraph is a code sample::
|
||||
|
||||
It is not processed in any way, except
|
||||
that the indentation is removed.
|
||||
|
||||
It can span multiple lines.
|
||||
|
||||
This is a normal text paragraph again.
|
||||
|
||||
The handling of the ``::`` marker is smart:
|
||||
|
||||
* If it occurs as a paragraph of its own, that paragraph is completely left
|
||||
out of the document.
|
||||
* If it is preceded by whitespace, the marker is removed.
|
||||
* If it is preceded by non-whitespace, the marker is replaced by a single
|
||||
colon.
|
||||
|
||||
That way, the second sentence in the above example's first paragraph would be
|
||||
rendered as "The next paragraph is a code sample:".
|
||||
|
||||
|
||||
Hyperlinks
|
||||
----------
|
||||
|
||||
External links
|
||||
^^^^^^^^^^^^^^
|
||||
|
||||
Use ```Link text <http://target>`_`` for inline web links. If the link text
|
||||
should be the web address, you don't need special markup at all, the parser
|
||||
finds links and mail addresses in ordinary text.
|
||||
|
||||
Internal links
|
||||
^^^^^^^^^^^^^^
|
||||
|
||||
Internal linking is done via a special reST role, see the section on specific
|
||||
markup, :ref:`doc-ref-role`.
|
||||
|
||||
|
||||
Sections
|
||||
--------
|
||||
|
||||
Section headers are created by underlining (and optionally overlining) the
|
||||
section title with a punctuation character, at least as long as the text::
|
||||
|
||||
=================
|
||||
This is a heading
|
||||
=================
|
||||
|
||||
Normally, there are no heading levels assigned to certain characters as the
|
||||
structure is determined from the succession of headings. However, for the
|
||||
Python documentation, we use this convention:
|
||||
|
||||
* ``#`` with overline, for parts
|
||||
* ``*`` with overline, for chapters
|
||||
* ``=``, for sections
|
||||
* ``-``, for subsections
|
||||
* ``^``, for subsubsections
|
||||
* ``"``, for paragraphs
|
||||
|
||||
|
||||
Explicit Markup
|
||||
---------------
|
||||
|
||||
"Explicit markup" is used in reST for most constructs that need special
|
||||
handling, such as footnotes, specially-highlighted paragraphs, comments, and
|
||||
generic directives.
|
||||
|
||||
An explicit markup block begins with a line starting with ``..`` followed by
|
||||
whitespace and is terminated by the next paragraph at the same level of
|
||||
indentation. (There needs to be a blank line between explicit markup and normal
|
||||
paragraphs. This may all sound a bit complicated, but it is intuitive enough
|
||||
when you write it.)
|
||||
|
||||
|
||||
Directives
|
||||
----------
|
||||
|
||||
A directive is a generic block of explicit markup. Besides roles, it is one of
|
||||
the extension mechanisms of reST, and Sphinx makes heavy use of it.
|
||||
|
||||
Basically, a directive consists of a name, arguments, options and content. (Keep
|
||||
this terminology in mind, it is used in the next chapter describing custom
|
||||
directives.) Looking at this example, ::
|
||||
|
||||
.. function:: foo(x)
|
||||
foo(y, z)
|
||||
:bar: no
|
||||
|
||||
Return a line of text input from the user.
|
||||
|
||||
``function`` is the directive name. It is given two arguments here, the
|
||||
remainder of the first line and the second line, as well as one option ``bar``
|
||||
(as you can see, options are given in the lines immediately following the
|
||||
arguments and indicated by the colons).
|
||||
|
||||
The directive content follows after a blank line and is indented relative to the
|
||||
directive start.
|
||||
|
||||
|
||||
Footnotes
|
||||
---------
|
||||
|
||||
For footnotes, use ``[#]_`` to mark the footnote location, and add the footnote
|
||||
body at the bottom of the document after a "Footnotes" rubric heading, like so::
|
||||
|
||||
Lorem ipsum [#]_ dolor sit amet ... [#]_
|
||||
|
||||
.. rubric:: Footnotes
|
||||
|
||||
.. [#] Text of the first footnote.
|
||||
.. [#] Text of the second footnote.
|
||||
|
||||
|
||||
Comments
|
||||
--------
|
||||
|
||||
Every explicit markup block which isn't a valid markup construct (like the
|
||||
footnotes above) is regared as a comment.
|
||||
|
||||
|
||||
Source encoding
|
||||
---------------
|
||||
|
||||
Since the easiest way to include special characters like em dashes or copyright
|
||||
signs in reST is to directly write them as Unicode characters, one has to
|
||||
specify an encoding:
|
||||
|
||||
All Python documentation source files must be in UTF-8 encoding, and the HTML
|
||||
documents written from them will be in that encoding as well.
|
||||
|
||||
|
||||
XXX: Gotchas
|
||||
60
Doc-26/documenting/sphinx.rst
Normal file
60
Doc-26/documenting/sphinx.rst
Normal file
@@ -0,0 +1,60 @@
|
||||
.. highlightlang:: rest
|
||||
|
||||
The Sphinx build system
|
||||
=======================
|
||||
|
||||
XXX: intro...
|
||||
|
||||
.. _doc-build-config:
|
||||
|
||||
The build configuration file
|
||||
----------------------------
|
||||
|
||||
The documentation root, that is the ``Doc`` subdirectory of the source
|
||||
distribution, contains a file named ``conf.py``. This file is called the "build
|
||||
configuration file", and it contains several variables that are read and used
|
||||
during a build run.
|
||||
|
||||
These variables are:
|
||||
|
||||
version : string
|
||||
A string that is used as a replacement for the ``|version|`` reST
|
||||
substitution. It should be the Python version the documentation refers to.
|
||||
This consists only of the major and minor version parts, e.g. ``2.5``, even
|
||||
for version 2.5.1.
|
||||
|
||||
release : string
|
||||
A string that is used as a replacement for the ``|release|`` reST
|
||||
substitution. It should be the full version string including
|
||||
alpha/beta/release candidate tags, e.g. ``2.5.2b3``.
|
||||
|
||||
Both ``release`` and ``version`` can be ``'auto'``, which means that they are
|
||||
determined at runtime from the ``Include/patchlevel.h`` file, if a complete
|
||||
Python source distribution can be found, or else from the interpreter running
|
||||
Sphinx.
|
||||
|
||||
today_fmt : string
|
||||
A ``strftime`` format that is used to format a replacement for the
|
||||
``|today|`` reST substitution.
|
||||
|
||||
today : string
|
||||
A string that can contain a date that should be written to the documentation
|
||||
output literally. If this is nonzero, it is used instead of
|
||||
``strftime(today_fmt)``.
|
||||
|
||||
unused_files : list of strings
|
||||
A list of reST filenames that are to be disregarded during building. This
|
||||
could be docs for temporarily disabled modules or documentation that's not
|
||||
yet ready for public consumption.
|
||||
|
||||
last_updated_format : string
|
||||
If this is not an empty string, it will be given to ``time.strftime()`` and
|
||||
written to each generated output file after "last updated on:".
|
||||
|
||||
use_smartypants : bool
|
||||
If true, use SmartyPants to convert quotes and dashes to the typographically
|
||||
correct entities.
|
||||
|
||||
add_function_parentheses : bool
|
||||
If true, ``()`` will be appended to the content of ``:func:``, ``:meth:`` and
|
||||
``:cfunc:`` cross-references.
|
||||
57
Doc-26/documenting/style.rst
Normal file
57
Doc-26/documenting/style.rst
Normal file
@@ -0,0 +1,57 @@
|
||||
.. highlightlang:: rest
|
||||
|
||||
Style Guide
|
||||
===========
|
||||
|
||||
The Python documentation should follow the `Apple Publications Style Guide`_
|
||||
wherever possible. This particular style guide was selected mostly because it
|
||||
seems reasonable and is easy to get online.
|
||||
|
||||
.. _Apple Publications Style Guide: http://developer.apple.com/documentation/UserExperience/Conceptual/APStyleGuide/AppleStyleGuide2003.pdf
|
||||
|
||||
Topics which are not covered in the Apple's style guide will be discussed in
|
||||
this document if necessary.
|
||||
|
||||
Footnotes are generally discouraged, though they may be used when they are the
|
||||
best way to present specific information. When a footnote reference is added at
|
||||
the end of the sentence, it should follow the sentence-ending punctuation. The
|
||||
reST markup should appear something like this::
|
||||
|
||||
This sentence has a footnote reference. [#]_ This is the next sentence.
|
||||
|
||||
Footnotes should be gathered at the end of a file, or if the file is very long,
|
||||
at the end of a section. The docutils will automatically create backlinks to the
|
||||
footnote reference.
|
||||
|
||||
Footnotes may appear in the middle of sentences where appropriate.
|
||||
|
||||
Many special names are used in the Python documentation, including the names of
|
||||
operating systems, programming languages, standards bodies, and the like. Most
|
||||
of these entities are not assigned any special markup, but the preferred
|
||||
spellings are given here to aid authors in maintaining the consistency of
|
||||
presentation in the Python documentation.
|
||||
|
||||
Other terms and words deserve special mention as well; these conventions should
|
||||
be used to ensure consistency throughout the documentation:
|
||||
|
||||
CPU
|
||||
For "central processing unit." Many style guides say this should be spelled
|
||||
out on the first use (and if you must use it, do so!). For the Python
|
||||
documentation, this abbreviation should be avoided since there's no
|
||||
reasonable way to predict which occurrence will be the first seen by the
|
||||
reader. It is better to use the word "processor" instead.
|
||||
|
||||
POSIX
|
||||
The name assigned to a particular group of standards. This is always
|
||||
uppercase.
|
||||
|
||||
Python
|
||||
The name of our favorite programming language is always capitalized.
|
||||
|
||||
Unicode
|
||||
The name of a character set and matching encoding. This is always written
|
||||
capitalized.
|
||||
|
||||
Unix
|
||||
The name of the operating system developed at AT&T Bell Labs in the early
|
||||
1970s.
|
||||
132
Doc-26/extending/building.rst
Normal file
132
Doc-26/extending/building.rst
Normal file
@@ -0,0 +1,132 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
|
||||
.. _building:
|
||||
|
||||
********************************************
|
||||
Building C and C++ Extensions with distutils
|
||||
********************************************
|
||||
|
||||
.. sectionauthor:: Martin v. Löwis <martin@v.loewis.de>
|
||||
|
||||
|
||||
Starting in Python 1.4, Python provides, on Unix, a special make file for
|
||||
building make files for building dynamically-linked extensions and custom
|
||||
interpreters. Starting with Python 2.0, this mechanism (known as related to
|
||||
Makefile.pre.in, and Setup files) is no longer supported. Building custom
|
||||
interpreters was rarely used, and extension modules can be built using
|
||||
distutils.
|
||||
|
||||
Building an extension module using distutils requires that distutils is
|
||||
installed on the build machine, which is included in Python 2.x and available
|
||||
separately for Python 1.5. Since distutils also supports creation of binary
|
||||
packages, users don't necessarily need a compiler and distutils to install the
|
||||
extension.
|
||||
|
||||
A distutils package contains a driver script, :file:`setup.py`. This is a plain
|
||||
Python file, which, in the most simple case, could look like this::
|
||||
|
||||
from distutils.core import setup, Extension
|
||||
|
||||
module1 = Extension('demo',
|
||||
sources = ['demo.c'])
|
||||
|
||||
setup (name = 'PackageName',
|
||||
version = '1.0',
|
||||
description = 'This is a demo package',
|
||||
ext_modules = [module1])
|
||||
|
||||
|
||||
With this :file:`setup.py`, and a file :file:`demo.c`, running ::
|
||||
|
||||
python setup.py build
|
||||
|
||||
will compile :file:`demo.c`, and produce an extension module named ``demo`` in
|
||||
the :file:`build` directory. Depending on the system, the module file will end
|
||||
up in a subdirectory :file:`build/lib.system`, and may have a name like
|
||||
:file:`demo.so` or :file:`demo.pyd`.
|
||||
|
||||
In the :file:`setup.py`, all execution is performed by calling the ``setup``
|
||||
function. This takes a variable number of keyword arguments, of which the
|
||||
example above uses only a subset. Specifically, the example specifies meta-
|
||||
information to build packages, and it specifies the contents of the package.
|
||||
Normally, a package will contain of addition modules, like Python source
|
||||
modules, documentation, subpackages, etc. Please refer to the distutils
|
||||
documentation in Distributing Python Modules (XXX reference: ../dist/dist.html)
|
||||
to learn more about the features of distutils; this section explains building
|
||||
extension modules only.
|
||||
|
||||
It is common to pre-compute arguments to :func:`setup`, to better structure the
|
||||
driver script. In the example above, the\ ``ext_modules`` argument to
|
||||
:func:`setup` is a list of extension modules, each of which is an instance of
|
||||
the :class:`Extension`. In the example, the instance defines an extension named
|
||||
``demo`` which is build by compiling a single source file, :file:`demo.c`.
|
||||
|
||||
In many cases, building an extension is more complex, since additional
|
||||
preprocessor defines and libraries may be needed. This is demonstrated in the
|
||||
example below. ::
|
||||
|
||||
from distutils.core import setup, Extension
|
||||
|
||||
module1 = Extension('demo',
|
||||
define_macros = [('MAJOR_VERSION', '1'),
|
||||
('MINOR_VERSION', '0')],
|
||||
include_dirs = ['/usr/local/include'],
|
||||
libraries = ['tcl83'],
|
||||
library_dirs = ['/usr/local/lib'],
|
||||
sources = ['demo.c'])
|
||||
|
||||
setup (name = 'PackageName',
|
||||
version = '1.0',
|
||||
description = 'This is a demo package',
|
||||
author = 'Martin v. Loewis',
|
||||
author_email = 'martin@v.loewis.de',
|
||||
url = 'http://www.python.org/doc/current/ext/building.html',
|
||||
long_description = '''
|
||||
This is really just a demo package.
|
||||
''',
|
||||
ext_modules = [module1])
|
||||
|
||||
|
||||
In this example, :func:`setup` is called with additional meta-information, which
|
||||
is recommended when distribution packages have to be built. For the extension
|
||||
itself, it specifies preprocessor defines, include directories, library
|
||||
directories, and libraries. Depending on the compiler, distutils passes this
|
||||
information in different ways to the compiler. For example, on Unix, this may
|
||||
result in the compilation commands ::
|
||||
|
||||
gcc -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -fPIC -DMAJOR_VERSION=1 -DMINOR_VERSION=0 -I/usr/local/include -I/usr/local/include/python2.2 -c demo.c -o build/temp.linux-i686-2.2/demo.o
|
||||
|
||||
gcc -shared build/temp.linux-i686-2.2/demo.o -L/usr/local/lib -ltcl83 -o build/lib.linux-i686-2.2/demo.so
|
||||
|
||||
These lines are for demonstration purposes only; distutils users should trust
|
||||
that distutils gets the invocations right.
|
||||
|
||||
|
||||
.. _distributing:
|
||||
|
||||
Distributing your extension modules
|
||||
===================================
|
||||
|
||||
When an extension has been successfully build, there are three ways to use it.
|
||||
|
||||
End-users will typically want to install the module, they do so by running ::
|
||||
|
||||
python setup.py install
|
||||
|
||||
Module maintainers should produce source packages; to do so, they run ::
|
||||
|
||||
python setup.py sdist
|
||||
|
||||
In some cases, additional files need to be included in a source distribution;
|
||||
this is done through a :file:`MANIFEST.in` file; see the distutils documentation
|
||||
for details.
|
||||
|
||||
If the source distribution has been build successfully, maintainers can also
|
||||
create binary distributions. Depending on the platform, one of the following
|
||||
commands can be used to do so. ::
|
||||
|
||||
python setup.py bdist_wininst
|
||||
python setup.py bdist_rpm
|
||||
python setup.py bdist_dumb
|
||||
|
||||
298
Doc-26/extending/embedding.rst
Normal file
298
Doc-26/extending/embedding.rst
Normal file
@@ -0,0 +1,298 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
|
||||
.. _embedding:
|
||||
|
||||
***************************************
|
||||
Embedding Python in Another Application
|
||||
***************************************
|
||||
|
||||
The previous chapters discussed how to extend Python, that is, how to extend the
|
||||
functionality of Python by attaching a library of C functions to it. It is also
|
||||
possible to do it the other way around: enrich your C/C++ application by
|
||||
embedding Python in it. Embedding provides your application with the ability to
|
||||
implement some of the functionality of your application in Python rather than C
|
||||
or C++. This can be used for many purposes; one example would be to allow users
|
||||
to tailor the application to their needs by writing some scripts in Python. You
|
||||
can also use it yourself if some of the functionality can be written in Python
|
||||
more easily.
|
||||
|
||||
Embedding Python is similar to extending it, but not quite. The difference is
|
||||
that when you extend Python, the main program of the application is still the
|
||||
Python interpreter, while if you embed Python, the main program may have nothing
|
||||
to do with Python --- instead, some parts of the application occasionally call
|
||||
the Python interpreter to run some Python code.
|
||||
|
||||
So if you are embedding Python, you are providing your own main program. One of
|
||||
the things this main program has to do is initialize the Python interpreter. At
|
||||
the very least, you have to call the function :cfunc:`Py_Initialize` (on Mac OS,
|
||||
call :cfunc:`PyMac_Initialize` instead). There are optional calls to pass
|
||||
command line arguments to Python. Then later you can call the interpreter from
|
||||
any part of the application.
|
||||
|
||||
There are several different ways to call the interpreter: you can pass a string
|
||||
containing Python statements to :cfunc:`PyRun_SimpleString`, or you can pass a
|
||||
stdio file pointer and a file name (for identification in error messages only)
|
||||
to :cfunc:`PyRun_SimpleFile`. You can also call the lower-level operations
|
||||
described in the previous chapters to construct and use Python objects.
|
||||
|
||||
A simple demo of embedding Python can be found in the directory
|
||||
:file:`Demo/embed/` of the source distribution.
|
||||
|
||||
|
||||
.. seealso::
|
||||
|
||||
`Python/C API Reference Manual <../api/api.html>`_
|
||||
The details of Python's C interface are given in this manual. A great deal of
|
||||
necessary information can be found here.
|
||||
|
||||
|
||||
.. _high-level-embedding:
|
||||
|
||||
Very High Level Embedding
|
||||
=========================
|
||||
|
||||
The simplest form of embedding Python is the use of the very high level
|
||||
interface. This interface is intended to execute a Python script without needing
|
||||
to interact with the application directly. This can for example be used to
|
||||
perform some operation on a file. ::
|
||||
|
||||
#include <Python.h>
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
Py_Initialize();
|
||||
PyRun_SimpleString("from time import time,ctime\n"
|
||||
"print 'Today is',ctime(time())\n");
|
||||
Py_Finalize();
|
||||
return 0;
|
||||
}
|
||||
|
||||
The above code first initializes the Python interpreter with
|
||||
:cfunc:`Py_Initialize`, followed by the execution of a hard-coded Python script
|
||||
that print the date and time. Afterwards, the :cfunc:`Py_Finalize` call shuts
|
||||
the interpreter down, followed by the end of the program. In a real program,
|
||||
you may want to get the Python script from another source, perhaps a text-editor
|
||||
routine, a file, or a database. Getting the Python code from a file can better
|
||||
be done by using the :cfunc:`PyRun_SimpleFile` function, which saves you the
|
||||
trouble of allocating memory space and loading the file contents.
|
||||
|
||||
|
||||
.. _lower-level-embedding:
|
||||
|
||||
Beyond Very High Level Embedding: An overview
|
||||
=============================================
|
||||
|
||||
The high level interface gives you the ability to execute arbitrary pieces of
|
||||
Python code from your application, but exchanging data values is quite
|
||||
cumbersome to say the least. If you want that, you should use lower level calls.
|
||||
At the cost of having to write more C code, you can achieve almost anything.
|
||||
|
||||
It should be noted that extending Python and embedding Python is quite the same
|
||||
activity, despite the different intent. Most topics discussed in the previous
|
||||
chapters are still valid. To show this, consider what the extension code from
|
||||
Python to C really does:
|
||||
|
||||
#. Convert data values from Python to C,
|
||||
|
||||
#. Perform a function call to a C routine using the converted values, and
|
||||
|
||||
#. Convert the data values from the call from C to Python.
|
||||
|
||||
When embedding Python, the interface code does:
|
||||
|
||||
#. Convert data values from C to Python,
|
||||
|
||||
#. Perform a function call to a Python interface routine using the converted
|
||||
values, and
|
||||
|
||||
#. Convert the data values from the call from Python to C.
|
||||
|
||||
As you can see, the data conversion steps are simply swapped to accommodate the
|
||||
different direction of the cross-language transfer. The only difference is the
|
||||
routine that you call between both data conversions. When extending, you call a
|
||||
C routine, when embedding, you call a Python routine.
|
||||
|
||||
This chapter will not discuss how to convert data from Python to C and vice
|
||||
versa. Also, proper use of references and dealing with errors is assumed to be
|
||||
understood. Since these aspects do not differ from extending the interpreter,
|
||||
you can refer to earlier chapters for the required information.
|
||||
|
||||
|
||||
.. _pure-embedding:
|
||||
|
||||
Pure Embedding
|
||||
==============
|
||||
|
||||
The first program aims to execute a function in a Python script. Like in the
|
||||
section about the very high level interface, the Python interpreter does not
|
||||
directly interact with the application (but that will change in the next
|
||||
section).
|
||||
|
||||
The code to run a function defined in a Python script is:
|
||||
|
||||
|
||||
.. include:: ../includes/run-func.c
|
||||
:literal:
|
||||
|
||||
This code loads a Python script using ``argv[1]``, and calls the function named
|
||||
in ``argv[2]``. Its integer arguments are the other values of the ``argv``
|
||||
array. If you compile and link this program (let's call the finished executable
|
||||
:program:`call`), and use it to execute a Python script, such as::
|
||||
|
||||
def multiply(a,b):
|
||||
print "Will compute", a, "times", b
|
||||
c = 0
|
||||
for i in range(0, a):
|
||||
c = c + b
|
||||
return c
|
||||
|
||||
then the result should be::
|
||||
|
||||
$ call multiply multiply 3 2
|
||||
Will compute 3 times 2
|
||||
Result of call: 6
|
||||
|
||||
Although the program is quite large for its functionality, most of the code is
|
||||
for data conversion between Python and C, and for error reporting. The
|
||||
interesting part with respect to embedding Python starts with
|
||||
|
||||
.. % $
|
||||
|
||||
::
|
||||
|
||||
Py_Initialize();
|
||||
pName = PyString_FromString(argv[1]);
|
||||
/* Error checking of pName left out */
|
||||
pModule = PyImport_Import(pName);
|
||||
|
||||
After initializing the interpreter, the script is loaded using
|
||||
:cfunc:`PyImport_Import`. This routine needs a Python string as its argument,
|
||||
which is constructed using the :cfunc:`PyString_FromString` data conversion
|
||||
routine. ::
|
||||
|
||||
pFunc = PyObject_GetAttrString(pModule, argv[2]);
|
||||
/* pFunc is a new reference */
|
||||
|
||||
if (pFunc && PyCallable_Check(pFunc)) {
|
||||
...
|
||||
}
|
||||
Py_XDECREF(pFunc);
|
||||
|
||||
Once the script is loaded, the name we're looking for is retrieved using
|
||||
:cfunc:`PyObject_GetAttrString`. If the name exists, and the object returned is
|
||||
callable, you can safely assume that it is a function. The program then
|
||||
proceeds by constructing a tuple of arguments as normal. The call to the Python
|
||||
function is then made with::
|
||||
|
||||
pValue = PyObject_CallObject(pFunc, pArgs);
|
||||
|
||||
Upon return of the function, ``pValue`` is either *NULL* or it contains a
|
||||
reference to the return value of the function. Be sure to release the reference
|
||||
after examining the value.
|
||||
|
||||
|
||||
.. _extending-with-embedding:
|
||||
|
||||
Extending Embedded Python
|
||||
=========================
|
||||
|
||||
Until now, the embedded Python interpreter had no access to functionality from
|
||||
the application itself. The Python API allows this by extending the embedded
|
||||
interpreter. That is, the embedded interpreter gets extended with routines
|
||||
provided by the application. While it sounds complex, it is not so bad. Simply
|
||||
forget for a while that the application starts the Python interpreter. Instead,
|
||||
consider the application to be a set of subroutines, and write some glue code
|
||||
that gives Python access to those routines, just like you would write a normal
|
||||
Python extension. For example::
|
||||
|
||||
static int numargs=0;
|
||||
|
||||
/* Return the number of arguments of the application command line */
|
||||
static PyObject*
|
||||
emb_numargs(PyObject *self, PyObject *args)
|
||||
{
|
||||
if(!PyArg_ParseTuple(args, ":numargs"))
|
||||
return NULL;
|
||||
return Py_BuildValue("i", numargs);
|
||||
}
|
||||
|
||||
static PyMethodDef EmbMethods[] = {
|
||||
{"numargs", emb_numargs, METH_VARARGS,
|
||||
"Return the number of arguments received by the process."},
|
||||
{NULL, NULL, 0, NULL}
|
||||
};
|
||||
|
||||
Insert the above code just above the :cfunc:`main` function. Also, insert the
|
||||
following two statements directly after :cfunc:`Py_Initialize`::
|
||||
|
||||
numargs = argc;
|
||||
Py_InitModule("emb", EmbMethods);
|
||||
|
||||
These two lines initialize the ``numargs`` variable, and make the
|
||||
:func:`emb.numargs` function accessible to the embedded Python interpreter.
|
||||
With these extensions, the Python script can do things like ::
|
||||
|
||||
import emb
|
||||
print "Number of arguments", emb.numargs()
|
||||
|
||||
In a real application, the methods will expose an API of the application to
|
||||
Python.
|
||||
|
||||
.. % \section{For the future}
|
||||
.. %
|
||||
.. % You don't happen to have a nice library to get textual
|
||||
.. % equivalents of numeric values do you :-) ?
|
||||
.. % Callbacks here ? (I may be using information from that section
|
||||
.. % ?!)
|
||||
.. % threads
|
||||
.. % code examples do not really behave well if errors happen
|
||||
.. % (what to watch out for)
|
||||
|
||||
|
||||
.. _embeddingincplusplus:
|
||||
|
||||
Embedding Python in C++
|
||||
=======================
|
||||
|
||||
It is also possible to embed Python in a C++ program; precisely how this is done
|
||||
will depend on the details of the C++ system used; in general you will need to
|
||||
write the main program in C++, and use the C++ compiler to compile and link your
|
||||
program. There is no need to recompile Python itself using C++.
|
||||
|
||||
|
||||
.. _link-reqs:
|
||||
|
||||
Linking Requirements
|
||||
====================
|
||||
|
||||
While the :program:`configure` script shipped with the Python sources will
|
||||
correctly build Python to export the symbols needed by dynamically linked
|
||||
extensions, this is not automatically inherited by applications which embed the
|
||||
Python library statically, at least on Unix. This is an issue when the
|
||||
application is linked to the static runtime library (:file:`libpython.a`) and
|
||||
needs to load dynamic extensions (implemented as :file:`.so` files).
|
||||
|
||||
The problem is that some entry points are defined by the Python runtime solely
|
||||
for extension modules to use. If the embedding application does not use any of
|
||||
these entry points, some linkers will not include those entries in the symbol
|
||||
table of the finished executable. Some additional options are needed to inform
|
||||
the linker not to remove these symbols.
|
||||
|
||||
Determining the right options to use for any given platform can be quite
|
||||
difficult, but fortunately the Python configuration already has those values.
|
||||
To retrieve them from an installed Python interpreter, start an interactive
|
||||
interpreter and have a short session like this::
|
||||
|
||||
>>> import distutils.sysconfig
|
||||
>>> distutils.sysconfig.get_config_var('LINKFORSHARED')
|
||||
'-Xlinker -export-dynamic'
|
||||
|
||||
.. index:: module: distutils.sysconfig
|
||||
|
||||
The contents of the string presented will be the options that should be used.
|
||||
If the string is empty, there's no need to add any additional options. The
|
||||
:const:`LINKFORSHARED` definition corresponds to the variable of the same name
|
||||
in Python's top-level :file:`Makefile`.
|
||||
|
||||
1280
Doc-26/extending/extending.rst
Normal file
1280
Doc-26/extending/extending.rst
Normal file
File diff suppressed because it is too large
Load Diff
34
Doc-26/extending/index.rst
Normal file
34
Doc-26/extending/index.rst
Normal file
@@ -0,0 +1,34 @@
|
||||
.. _extending-index:
|
||||
|
||||
##################################################
|
||||
Extending and Embedding the Python Interpreter
|
||||
##################################################
|
||||
|
||||
:Release: |version|
|
||||
:Date: |today|
|
||||
|
||||
This document describes how to write modules in C or C++ to extend the Python
|
||||
interpreter with new modules. Those modules can define new functions but also
|
||||
new object types and their methods. The document also describes how to embed
|
||||
the Python interpreter in another application, for use as an extension language.
|
||||
Finally, it shows how to compile and link extension modules so that they can be
|
||||
loaded dynamically (at run time) into the interpreter, if the underlying
|
||||
operating system supports this feature.
|
||||
|
||||
This document assumes basic knowledge about Python. For an informal
|
||||
introduction to the language, see :ref:`tutorial-index`. :ref:`reference-index`
|
||||
gives a more formal definition of the language. :ref:`modules-index` documents
|
||||
the existing object types, functions and modules (both built-in and written in
|
||||
Python) that give the language its wide application range.
|
||||
|
||||
For a detailed description of the whole Python/C API, see the separate
|
||||
:ref:`c-api-index`.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
extending.rst
|
||||
newtypes.rst
|
||||
building.rst
|
||||
windows.rst
|
||||
embedding.rst
|
||||
1594
Doc-26/extending/newtypes.rst
Normal file
1594
Doc-26/extending/newtypes.rst
Normal file
File diff suppressed because it is too large
Load Diff
282
Doc-26/extending/windows.rst
Normal file
282
Doc-26/extending/windows.rst
Normal file
@@ -0,0 +1,282 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
|
||||
.. _building-on-windows:
|
||||
|
||||
****************************************
|
||||
Building C and C++ Extensions on Windows
|
||||
****************************************
|
||||
|
||||
.. %
|
||||
|
||||
This chapter briefly explains how to create a Windows extension module for
|
||||
Python using Microsoft Visual C++, and follows with more detailed background
|
||||
information on how it works. The explanatory material is useful for both the
|
||||
Windows programmer learning to build Python extensions and the Unix programmer
|
||||
interested in producing software which can be successfully built on both Unix
|
||||
and Windows.
|
||||
|
||||
Module authors are encouraged to use the distutils approach for building
|
||||
extension modules, instead of the one described in this section. You will still
|
||||
need the C compiler that was used to build Python; typically Microsoft Visual
|
||||
C++.
|
||||
|
||||
.. note::
|
||||
|
||||
This chapter mentions a number of filenames that include an encoded Python
|
||||
version number. These filenames are represented with the version number shown
|
||||
as ``XY``; in practive, ``'X'`` will be the major version number and ``'Y'``
|
||||
will be the minor version number of the Python release you're working with. For
|
||||
example, if you are using Python 2.2.1, ``XY`` will actually be ``22``.
|
||||
|
||||
|
||||
.. _win-cookbook:
|
||||
|
||||
A Cookbook Approach
|
||||
===================
|
||||
|
||||
There are two approaches to building extension modules on Windows, just as there
|
||||
are on Unix: use the :mod:`distutils` (XXX reference: ../lib/module-
|
||||
distutils.html) package to control the build process, or do things manually.
|
||||
The distutils approach works well for most extensions; documentation on using
|
||||
:mod:`distutils` (XXX reference: ../lib/module-distutils.html) to build and
|
||||
package extension modules is available in Distributing Python Modules (XXX
|
||||
reference: ../dist/dist.html). This section describes the manual approach to
|
||||
building Python extensions written in C or C++.
|
||||
|
||||
To build extensions using these instructions, you need to have a copy of the
|
||||
Python sources of the same version as your installed Python. You will need
|
||||
Microsoft Visual C++ "Developer Studio"; project files are supplied for VC++
|
||||
version 7.1, but you can use older versions of VC++. Notice that you should use
|
||||
the same version of VC++that was used to build Python itself. The example files
|
||||
described here are distributed with the Python sources in the
|
||||
:file:`PC\\example_nt\\` directory.
|
||||
|
||||
#. **Copy the example files** --- The :file:`example_nt` directory is a
|
||||
subdirectory of the :file:`PC` directory, in order to keep all the PC-specific
|
||||
files under the same directory in the source distribution. However, the
|
||||
:file:`example_nt` directory can't actually be used from this location. You
|
||||
first need to copy or move it up one level, so that :file:`example_nt` is a
|
||||
sibling of the :file:`PC` and :file:`Include` directories. Do all your work
|
||||
from within this new location.
|
||||
|
||||
#. **Open the project** --- From VC++, use the :menuselection:`File --> Open
|
||||
Solution` dialog (not :menuselection:`File --> Open`!). Navigate to and select
|
||||
the file :file:`example.sln`, in the *copy* of the :file:`example_nt` directory
|
||||
you made above. Click Open.
|
||||
|
||||
#. **Build the example DLL** --- In order to check that everything is set up
|
||||
right, try building:
|
||||
|
||||
#. Select a configuration. This step is optional. Choose :menuselection:`Build
|
||||
--> Configuration Manager --> Active Solution Configuration` and select either
|
||||
:guilabel:`Release` or\ :guilabel:`Debug`. If you skip this step, VC++ will
|
||||
use the Debug configuration by default.
|
||||
|
||||
#. Build the DLL. Choose :menuselection:`Build --> Build Solution`. This
|
||||
creates all intermediate and result files in a subdirectory called either
|
||||
:file:`Debug` or :file:`Release`, depending on which configuration you selected
|
||||
in the preceding step.
|
||||
|
||||
#. **Testing the debug-mode DLL** --- Once the Debug build has succeeded, bring
|
||||
up a DOS box, and change to the :file:`example_nt\\Debug` directory. You should
|
||||
now be able to repeat the following session (``C>`` is the DOS prompt, ``>>>``
|
||||
is the Python prompt; note that build information and various debug output from
|
||||
Python may not match this screen dump exactly)::
|
||||
|
||||
C>..\..\PCbuild\python_d
|
||||
Adding parser accelerators ...
|
||||
Done.
|
||||
Python 2.2 (#28, Dec 19 2001, 23:26:37) [MSC 32 bit (Intel)] on win32
|
||||
Type "copyright", "credits" or "license" for more information.
|
||||
>>> import example
|
||||
[4897 refs]
|
||||
>>> example.foo()
|
||||
Hello, world
|
||||
[4903 refs]
|
||||
>>>
|
||||
|
||||
Congratulations! You've successfully built your first Python extension module.
|
||||
|
||||
#. **Creating your own project** --- Choose a name and create a directory for
|
||||
it. Copy your C sources into it. Note that the module source file name does
|
||||
not necessarily have to match the module name, but the name of the
|
||||
initialization function should match the module name --- you can only import a
|
||||
module :mod:`spam` if its initialization function is called :cfunc:`initspam`,
|
||||
and it should call :cfunc:`Py_InitModule` with the string ``"spam"`` as its
|
||||
first argument (use the minimal :file:`example.c` in this directory as a guide).
|
||||
By convention, it lives in a file called :file:`spam.c` or :file:`spammodule.c`.
|
||||
The output file should be called :file:`spam.dll` or :file:`spam.pyd` (the
|
||||
latter is supported to avoid confusion with a system library :file:`spam.dll` to
|
||||
which your module could be a Python interface) in Release mode, or
|
||||
:file:`spam_d.dll` or :file:`spam_d.pyd` in Debug mode.
|
||||
|
||||
Now your options are:
|
||||
|
||||
#. Copy :file:`example.sln` and :file:`example.vcproj`, rename them to
|
||||
:file:`spam.\*`, and edit them by hand, or
|
||||
|
||||
#. Create a brand new project; instructions are below.
|
||||
|
||||
In either case, copy :file:`example_nt\\example.def` to :file:`spam\\spam.def`,
|
||||
and edit the new :file:`spam.def` so its second line contains the string
|
||||
'``initspam``'. If you created a new project yourself, add the file
|
||||
:file:`spam.def` to the project now. (This is an annoying little file with only
|
||||
two lines. An alternative approach is to forget about the :file:`.def` file,
|
||||
and add the option :option:`/export:initspam` somewhere to the Link settings, by
|
||||
manually editing the setting in Project Properties dialog).
|
||||
|
||||
#. **Creating a brand new project** --- Use the :menuselection:`File --> New
|
||||
--> Project` dialog to create a new Project Workspace. Select :guilabel:`Visual
|
||||
C++ Projects/Win32/ Win32 Project`, enter the name (``spam``), and make sure the
|
||||
Location is set to parent of the :file:`spam` directory you have created (which
|
||||
should be a direct subdirectory of the Python build tree, a sibling of
|
||||
:file:`Include` and :file:`PC`). Select Win32 as the platform (in my version,
|
||||
this is the only choice). Make sure the Create new workspace radio button is
|
||||
selected. Click OK.
|
||||
|
||||
You should now create the file :file:`spam.def` as instructed in the previous
|
||||
section. Add the source files to the project, using :menuselection:`Project -->
|
||||
Add Existing Item`. Set the pattern to ``*.*`` and select both :file:`spam.c`
|
||||
and :file:`spam.def` and click OK. (Inserting them one by one is fine too.)
|
||||
|
||||
Now open the :menuselection:`Project --> spam properties` dialog. You only need
|
||||
to change a few settings. Make sure :guilabel:`All Configurations` is selected
|
||||
from the :guilabel:`Settings for:` dropdown list. Select the C/C++ tab. Choose
|
||||
the General category in the popup menu at the top. Type the following text in
|
||||
the entry box labeled :guilabel:`Additional Include Directories`::
|
||||
|
||||
..\Include,..\PC
|
||||
|
||||
Then, choose the General category in the Linker tab, and enter ::
|
||||
|
||||
..\PCbuild
|
||||
|
||||
in the text box labelled :guilabel:`Additional library Directories`.
|
||||
|
||||
Now you need to add some mode-specific settings:
|
||||
|
||||
Select :guilabel:`Release` in the :guilabel:`Configuration` dropdown list.
|
||||
Choose the :guilabel:`Link` tab, choose the :guilabel:`Input` category, and
|
||||
append ``pythonXY.lib`` to the list in the :guilabel:`Additional Dependencies`
|
||||
box.
|
||||
|
||||
Select :guilabel:`Debug` in the :guilabel:`Configuration` dropdown list, and
|
||||
append ``pythonXY_d.lib`` to the list in the :guilabel:`Additional Dependencies`
|
||||
box. Then click the C/C++ tab, select :guilabel:`Code Generation`, and select
|
||||
:guilabel:`Multi-threaded Debug DLL` from the :guilabel:`Runtime library`
|
||||
dropdown list.
|
||||
|
||||
Select :guilabel:`Release` again from the :guilabel:`Configuration` dropdown
|
||||
list. Select :guilabel:`Multi-threaded DLL` from the :guilabel:`Runtime
|
||||
library` dropdown list.
|
||||
|
||||
If your module creates a new type, you may have trouble with this line::
|
||||
|
||||
PyObject_HEAD_INIT(&PyType_Type)
|
||||
|
||||
Change it to::
|
||||
|
||||
PyObject_HEAD_INIT(NULL)
|
||||
|
||||
and add the following to the module initialization function::
|
||||
|
||||
MyObject_Type.ob_type = &PyType_Type;
|
||||
|
||||
Refer to section 3 of the `Python FAQ <http://www.python.org/doc/FAQ.html>`_ for
|
||||
details on why you must do this.
|
||||
|
||||
|
||||
.. _dynamic-linking:
|
||||
|
||||
Differences Between Unix and Windows
|
||||
====================================
|
||||
|
||||
.. sectionauthor:: Chris Phoenix <cphoenix@best.com>
|
||||
|
||||
|
||||
Unix and Windows use completely different paradigms for run-time loading of
|
||||
code. Before you try to build a module that can be dynamically loaded, be aware
|
||||
of how your system works.
|
||||
|
||||
In Unix, a shared object (:file:`.so`) file contains code to be used by the
|
||||
program, and also the names of functions and data that it expects to find in the
|
||||
program. When the file is joined to the program, all references to those
|
||||
functions and data in the file's code are changed to point to the actual
|
||||
locations in the program where the functions and data are placed in memory.
|
||||
This is basically a link operation.
|
||||
|
||||
In Windows, a dynamic-link library (:file:`.dll`) file has no dangling
|
||||
references. Instead, an access to functions or data goes through a lookup
|
||||
table. So the DLL code does not have to be fixed up at runtime to refer to the
|
||||
program's memory; instead, the code already uses the DLL's lookup table, and the
|
||||
lookup table is modified at runtime to point to the functions and data.
|
||||
|
||||
In Unix, there is only one type of library file (:file:`.a`) which contains code
|
||||
from several object files (:file:`.o`). During the link step to create a shared
|
||||
object file (:file:`.so`), the linker may find that it doesn't know where an
|
||||
identifier is defined. The linker will look for it in the object files in the
|
||||
libraries; if it finds it, it will include all the code from that object file.
|
||||
|
||||
In Windows, there are two types of library, a static library and an import
|
||||
library (both called :file:`.lib`). A static library is like a Unix :file:`.a`
|
||||
file; it contains code to be included as necessary. An import library is
|
||||
basically used only to reassure the linker that a certain identifier is legal,
|
||||
and will be present in the program when the DLL is loaded. So the linker uses
|
||||
the information from the import library to build the lookup table for using
|
||||
identifiers that are not included in the DLL. When an application or a DLL is
|
||||
linked, an import library may be generated, which will need to be used for all
|
||||
future DLLs that depend on the symbols in the application or DLL.
|
||||
|
||||
Suppose you are building two dynamic-load modules, B and C, which should share
|
||||
another block of code A. On Unix, you would *not* pass :file:`A.a` to the
|
||||
linker for :file:`B.so` and :file:`C.so`; that would cause it to be included
|
||||
twice, so that B and C would each have their own copy. In Windows, building
|
||||
:file:`A.dll` will also build :file:`A.lib`. You *do* pass :file:`A.lib` to the
|
||||
linker for B and C. :file:`A.lib` does not contain code; it just contains
|
||||
information which will be used at runtime to access A's code.
|
||||
|
||||
In Windows, using an import library is sort of like using ``import spam``; it
|
||||
gives you access to spam's names, but does not create a separate copy. On Unix,
|
||||
linking with a library is more like ``from spam import *``; it does create a
|
||||
separate copy.
|
||||
|
||||
|
||||
.. _win-dlls:
|
||||
|
||||
Using DLLs in Practice
|
||||
======================
|
||||
|
||||
.. sectionauthor:: Chris Phoenix <cphoenix@best.com>
|
||||
|
||||
|
||||
Windows Python is built in Microsoft Visual C++; using other compilers may or
|
||||
may not work (though Borland seems to). The rest of this section is MSVC++
|
||||
specific.
|
||||
|
||||
When creating DLLs in Windows, you must pass :file:`pythonXY.lib` to the linker.
|
||||
To build two DLLs, spam and ni (which uses C functions found in spam), you could
|
||||
use these commands::
|
||||
|
||||
cl /LD /I/python/include spam.c ../libs/pythonXY.lib
|
||||
cl /LD /I/python/include ni.c spam.lib ../libs/pythonXY.lib
|
||||
|
||||
The first command created three files: :file:`spam.obj`, :file:`spam.dll` and
|
||||
:file:`spam.lib`. :file:`Spam.dll` does not contain any Python functions (such
|
||||
as :cfunc:`PyArg_ParseTuple`), but it does know how to find the Python code
|
||||
thanks to :file:`pythonXY.lib`.
|
||||
|
||||
The second command created :file:`ni.dll` (and :file:`.obj` and :file:`.lib`),
|
||||
which knows how to find the necessary functions from spam, and also from the
|
||||
Python executable.
|
||||
|
||||
Not every identifier is exported to the lookup table. If you want any other
|
||||
modules (including Python) to be able to see your identifiers, you have to say
|
||||
``_declspec(dllexport)``, as in ``void _declspec(dllexport) initspam(void)`` or
|
||||
``PyObject _declspec(dllexport) *NiGetSpamData(void)``.
|
||||
|
||||
Developer Studio will throw in a lot of import libraries that you do not really
|
||||
need, adding about 100K to your executable. To get rid of them, use the Project
|
||||
Settings dialog, Link tab, to specify *ignore default libraries*. Add the
|
||||
correct :file:`msvcrtxx.lib` to the list of libraries.
|
||||
|
||||
115
Doc-26/includes/email-dir.py
Normal file
115
Doc-26/includes/email-dir.py
Normal file
@@ -0,0 +1,115 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
"""Send the contents of a directory as a MIME message."""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import smtplib
|
||||
# For guessing MIME type based on file name extension
|
||||
import mimetypes
|
||||
|
||||
from optparse import OptionParser
|
||||
|
||||
from email import encoders
|
||||
from email.message import Message
|
||||
from email.mime.audio import MIMEAudio
|
||||
from email.mime.base import MIMEBase
|
||||
from email.mime.image import MIMEImage
|
||||
from email.mime.multipart import MIMEMultipart
|
||||
from email.mime.text import MIMEText
|
||||
|
||||
COMMASPACE = ', '
|
||||
|
||||
|
||||
def main():
|
||||
parser = OptionParser(usage="""\
|
||||
Send the contents of a directory as a MIME message.
|
||||
|
||||
Usage: %prog [options]
|
||||
|
||||
Unless the -o option is given, the email is sent by forwarding to your local
|
||||
SMTP server, which then does the normal delivery process. Your local machine
|
||||
must be running an SMTP server.
|
||||
""")
|
||||
parser.add_option('-d', '--directory',
|
||||
type='string', action='store',
|
||||
help="""Mail the contents of the specified directory,
|
||||
otherwise use the current directory. Only the regular
|
||||
files in the directory are sent, and we don't recurse to
|
||||
subdirectories.""")
|
||||
parser.add_option('-o', '--output',
|
||||
type='string', action='store', metavar='FILE',
|
||||
help="""Print the composed message to FILE instead of
|
||||
sending the message to the SMTP server.""")
|
||||
parser.add_option('-s', '--sender',
|
||||
type='string', action='store', metavar='SENDER',
|
||||
help='The value of the From: header (required)')
|
||||
parser.add_option('-r', '--recipient',
|
||||
type='string', action='append', metavar='RECIPIENT',
|
||||
default=[], dest='recipients',
|
||||
help='A To: header value (at least one required)')
|
||||
opts, args = parser.parse_args()
|
||||
if not opts.sender or not opts.recipients:
|
||||
parser.print_help()
|
||||
sys.exit(1)
|
||||
directory = opts.directory
|
||||
if not directory:
|
||||
directory = '.'
|
||||
# Create the enclosing (outer) message
|
||||
outer = MIMEMultipart()
|
||||
outer['Subject'] = 'Contents of directory %s' % os.path.abspath(directory)
|
||||
outer['To'] = COMMASPACE.join(opts.recipients)
|
||||
outer['From'] = opts.sender
|
||||
outer.preamble = 'You will not see this in a MIME-aware mail reader.\n'
|
||||
|
||||
for filename in os.listdir(directory):
|
||||
path = os.path.join(directory, filename)
|
||||
if not os.path.isfile(path):
|
||||
continue
|
||||
# Guess the content type based on the file's extension. Encoding
|
||||
# will be ignored, although we should check for simple things like
|
||||
# gzip'd or compressed files.
|
||||
ctype, encoding = mimetypes.guess_type(path)
|
||||
if ctype is None or encoding is not None:
|
||||
# No guess could be made, or the file is encoded (compressed), so
|
||||
# use a generic bag-of-bits type.
|
||||
ctype = 'application/octet-stream'
|
||||
maintype, subtype = ctype.split('/', 1)
|
||||
if maintype == 'text':
|
||||
fp = open(path)
|
||||
# Note: we should handle calculating the charset
|
||||
msg = MIMEText(fp.read(), _subtype=subtype)
|
||||
fp.close()
|
||||
elif maintype == 'image':
|
||||
fp = open(path, 'rb')
|
||||
msg = MIMEImage(fp.read(), _subtype=subtype)
|
||||
fp.close()
|
||||
elif maintype == 'audio':
|
||||
fp = open(path, 'rb')
|
||||
msg = MIMEAudio(fp.read(), _subtype=subtype)
|
||||
fp.close()
|
||||
else:
|
||||
fp = open(path, 'rb')
|
||||
msg = MIMEBase(maintype, subtype)
|
||||
msg.set_payload(fp.read())
|
||||
fp.close()
|
||||
# Encode the payload using Base64
|
||||
encoders.encode_base64(msg)
|
||||
# Set the filename parameter
|
||||
msg.add_header('Content-Disposition', 'attachment', filename=filename)
|
||||
outer.attach(msg)
|
||||
# Now send or store the message
|
||||
composed = outer.as_string()
|
||||
if opts.output:
|
||||
fp = open(opts.output, 'w')
|
||||
fp.write(composed)
|
||||
fp.close()
|
||||
else:
|
||||
s = smtplib.SMTP()
|
||||
s.connect()
|
||||
s.sendmail(opts.sender, opts.recipients, composed)
|
||||
s.close()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
32
Doc-26/includes/email-mime.py
Normal file
32
Doc-26/includes/email-mime.py
Normal file
@@ -0,0 +1,32 @@
|
||||
# Import smtplib for the actual sending function
|
||||
import smtplib
|
||||
|
||||
# Here are the email package modules we'll need
|
||||
from email.mime.image import MIMEImage
|
||||
from email.mime.multipart import MIMEMultipart
|
||||
|
||||
COMMASPACE = ', '
|
||||
|
||||
# Create the container (outer) email message.
|
||||
msg = MIMEMultipart()
|
||||
msg['Subject'] = 'Our family reunion'
|
||||
# me == the sender's email address
|
||||
# family = the list of all recipients' email addresses
|
||||
msg['From'] = me
|
||||
msg['To'] = COMMASPACE.join(family)
|
||||
msg.preamble = 'Our family reunion'
|
||||
|
||||
# Assume we know that the image files are all in PNG format
|
||||
for file in pngfiles:
|
||||
# Open the files in binary mode. Let the MIMEImage class automatically
|
||||
# guess the specific image type.
|
||||
fp = open(file, 'rb')
|
||||
img = MIMEImage(fp.read())
|
||||
fp.close()
|
||||
msg.attach(img)
|
||||
|
||||
# Send the email via our own SMTP server.
|
||||
s = smtplib.SMTP()
|
||||
s.connect()
|
||||
s.sendmail(me, family, msg.as_string())
|
||||
s.close()
|
||||
25
Doc-26/includes/email-simple.py
Normal file
25
Doc-26/includes/email-simple.py
Normal file
@@ -0,0 +1,25 @@
|
||||
# Import smtplib for the actual sending function
|
||||
import smtplib
|
||||
|
||||
# Import the email modules we'll need
|
||||
from email.mime.text import MIMEText
|
||||
|
||||
# Open a plain text file for reading. For this example, assume that
|
||||
# the text file contains only ASCII characters.
|
||||
fp = open(textfile, 'rb')
|
||||
# Create a text/plain message
|
||||
msg = MIMEText(fp.read())
|
||||
fp.close()
|
||||
|
||||
# me == the sender's email address
|
||||
# you == the recipient's email address
|
||||
msg['Subject'] = 'The contents of %s' % textfile
|
||||
msg['From'] = me
|
||||
msg['To'] = you
|
||||
|
||||
# Send the message via our own SMTP server, but don't include the
|
||||
# envelope header.
|
||||
s = smtplib.SMTP()
|
||||
s.connect()
|
||||
s.sendmail(me, [you], msg.as_string())
|
||||
s.close()
|
||||
68
Doc-26/includes/email-unpack.py
Normal file
68
Doc-26/includes/email-unpack.py
Normal file
@@ -0,0 +1,68 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
"""Unpack a MIME message into a directory of files."""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import email
|
||||
import errno
|
||||
import mimetypes
|
||||
|
||||
from optparse import OptionParser
|
||||
|
||||
|
||||
def main():
|
||||
parser = OptionParser(usage="""\
|
||||
Unpack a MIME message into a directory of files.
|
||||
|
||||
Usage: %prog [options] msgfile
|
||||
""")
|
||||
parser.add_option('-d', '--directory',
|
||||
type='string', action='store',
|
||||
help="""Unpack the MIME message into the named
|
||||
directory, which will be created if it doesn't already
|
||||
exist.""")
|
||||
opts, args = parser.parse_args()
|
||||
if not opts.directory:
|
||||
parser.print_help()
|
||||
sys.exit(1)
|
||||
|
||||
try:
|
||||
msgfile = args[0]
|
||||
except IndexError:
|
||||
parser.print_help()
|
||||
sys.exit(1)
|
||||
|
||||
try:
|
||||
os.mkdir(opts.directory)
|
||||
except OSError, e:
|
||||
# Ignore directory exists error
|
||||
if e.errno <> errno.EEXIST:
|
||||
raise
|
||||
|
||||
fp = open(msgfile)
|
||||
msg = email.message_from_file(fp)
|
||||
fp.close()
|
||||
|
||||
counter = 1
|
||||
for part in msg.walk():
|
||||
# multipart/* are just containers
|
||||
if part.get_content_maintype() == 'multipart':
|
||||
continue
|
||||
# Applications should really sanitize the given filename so that an
|
||||
# email message can't be used to overwrite important files
|
||||
filename = part.get_filename()
|
||||
if not filename:
|
||||
ext = mimetypes.guess_extension(part.get_type())
|
||||
if not ext:
|
||||
# Use a generic bag-of-bits extension
|
||||
ext = '.bin'
|
||||
filename = 'part-%03d%s' % (counter, ext)
|
||||
counter += 1
|
||||
fp = open(os.path.join(opts.directory, filename), 'wb')
|
||||
fp.write(part.get_payload(decode=True))
|
||||
fp.close()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
64
Doc-26/includes/minidom-example.py
Normal file
64
Doc-26/includes/minidom-example.py
Normal file
@@ -0,0 +1,64 @@
|
||||
import xml.dom.minidom
|
||||
|
||||
document = """\
|
||||
<slideshow>
|
||||
<title>Demo slideshow</title>
|
||||
<slide><title>Slide title</title>
|
||||
<point>This is a demo</point>
|
||||
<point>Of a program for processing slides</point>
|
||||
</slide>
|
||||
|
||||
<slide><title>Another demo slide</title>
|
||||
<point>It is important</point>
|
||||
<point>To have more than</point>
|
||||
<point>one slide</point>
|
||||
</slide>
|
||||
</slideshow>
|
||||
"""
|
||||
|
||||
dom = xml.dom.minidom.parseString(document)
|
||||
|
||||
def getText(nodelist):
|
||||
rc = ""
|
||||
for node in nodelist:
|
||||
if node.nodeType == node.TEXT_NODE:
|
||||
rc = rc + node.data
|
||||
return rc
|
||||
|
||||
def handleSlideshow(slideshow):
|
||||
print "<html>"
|
||||
handleSlideshowTitle(slideshow.getElementsByTagName("title")[0])
|
||||
slides = slideshow.getElementsByTagName("slide")
|
||||
handleToc(slides)
|
||||
handleSlides(slides)
|
||||
print "</html>"
|
||||
|
||||
def handleSlides(slides):
|
||||
for slide in slides:
|
||||
handleSlide(slide)
|
||||
|
||||
def handleSlide(slide):
|
||||
handleSlideTitle(slide.getElementsByTagName("title")[0])
|
||||
handlePoints(slide.getElementsByTagName("point"))
|
||||
|
||||
def handleSlideshowTitle(title):
|
||||
print "<title>%s</title>" % getText(title.childNodes)
|
||||
|
||||
def handleSlideTitle(title):
|
||||
print "<h2>%s</h2>" % getText(title.childNodes)
|
||||
|
||||
def handlePoints(points):
|
||||
print "<ul>"
|
||||
for point in points:
|
||||
handlePoint(point)
|
||||
print "</ul>"
|
||||
|
||||
def handlePoint(point):
|
||||
print "<li>%s</li>" % getText(point.childNodes)
|
||||
|
||||
def handleToc(slides):
|
||||
for slide in slides:
|
||||
title = slide.getElementsByTagName("title")[0]
|
||||
print "<p>%s</p>" % getText(title.childNodes)
|
||||
|
||||
handleSlideshow(dom)
|
||||
54
Doc-26/includes/noddy.c
Normal file
54
Doc-26/includes/noddy.c
Normal file
@@ -0,0 +1,54 @@
|
||||
#include <Python.h>
|
||||
|
||||
typedef struct {
|
||||
PyObject_HEAD
|
||||
/* Type-specific fields go here. */
|
||||
} noddy_NoddyObject;
|
||||
|
||||
static PyTypeObject noddy_NoddyType = {
|
||||
PyObject_HEAD_INIT(NULL)
|
||||
0, /*ob_size*/
|
||||
"noddy.Noddy", /*tp_name*/
|
||||
sizeof(noddy_NoddyObject), /*tp_basicsize*/
|
||||
0, /*tp_itemsize*/
|
||||
0, /*tp_dealloc*/
|
||||
0, /*tp_print*/
|
||||
0, /*tp_getattr*/
|
||||
0, /*tp_setattr*/
|
||||
0, /*tp_compare*/
|
||||
0, /*tp_repr*/
|
||||
0, /*tp_as_number*/
|
||||
0, /*tp_as_sequence*/
|
||||
0, /*tp_as_mapping*/
|
||||
0, /*tp_hash */
|
||||
0, /*tp_call*/
|
||||
0, /*tp_str*/
|
||||
0, /*tp_getattro*/
|
||||
0, /*tp_setattro*/
|
||||
0, /*tp_as_buffer*/
|
||||
Py_TPFLAGS_DEFAULT, /*tp_flags*/
|
||||
"Noddy objects", /* tp_doc */
|
||||
};
|
||||
|
||||
static PyMethodDef noddy_methods[] = {
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
|
||||
#define PyMODINIT_FUNC void
|
||||
#endif
|
||||
PyMODINIT_FUNC
|
||||
initnoddy(void)
|
||||
{
|
||||
PyObject* m;
|
||||
|
||||
noddy_NoddyType.tp_new = PyType_GenericNew;
|
||||
if (PyType_Ready(&noddy_NoddyType) < 0)
|
||||
return;
|
||||
|
||||
m = Py_InitModule3("noddy", noddy_methods,
|
||||
"Example module that creates an extension type.");
|
||||
|
||||
Py_INCREF(&noddy_NoddyType);
|
||||
PyModule_AddObject(m, "Noddy", (PyObject *)&noddy_NoddyType);
|
||||
}
|
||||
190
Doc-26/includes/noddy2.c
Normal file
190
Doc-26/includes/noddy2.c
Normal file
@@ -0,0 +1,190 @@
|
||||
#include <Python.h>
|
||||
#include "structmember.h"
|
||||
|
||||
typedef struct {
|
||||
PyObject_HEAD
|
||||
PyObject *first; /* first name */
|
||||
PyObject *last; /* last name */
|
||||
int number;
|
||||
} Noddy;
|
||||
|
||||
static void
|
||||
Noddy_dealloc(Noddy* self)
|
||||
{
|
||||
Py_XDECREF(self->first);
|
||||
Py_XDECREF(self->last);
|
||||
self->ob_type->tp_free((PyObject*)self);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||
{
|
||||
Noddy *self;
|
||||
|
||||
self = (Noddy *)type->tp_alloc(type, 0);
|
||||
if (self != NULL) {
|
||||
self->first = PyString_FromString("");
|
||||
if (self->first == NULL)
|
||||
{
|
||||
Py_DECREF(self);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
self->last = PyString_FromString("");
|
||||
if (self->last == NULL)
|
||||
{
|
||||
Py_DECREF(self);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
self->number = 0;
|
||||
}
|
||||
|
||||
return (PyObject *)self;
|
||||
}
|
||||
|
||||
static int
|
||||
Noddy_init(Noddy *self, PyObject *args, PyObject *kwds)
|
||||
{
|
||||
PyObject *first=NULL, *last=NULL, *tmp;
|
||||
|
||||
static char *kwlist[] = {"first", "last", "number", NULL};
|
||||
|
||||
if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist,
|
||||
&first, &last,
|
||||
&self->number))
|
||||
return -1;
|
||||
|
||||
if (first) {
|
||||
tmp = self->first;
|
||||
Py_INCREF(first);
|
||||
self->first = first;
|
||||
Py_XDECREF(tmp);
|
||||
}
|
||||
|
||||
if (last) {
|
||||
tmp = self->last;
|
||||
Py_INCREF(last);
|
||||
self->last = last;
|
||||
Py_XDECREF(tmp);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static PyMemberDef Noddy_members[] = {
|
||||
{"first", T_OBJECT_EX, offsetof(Noddy, first), 0,
|
||||
"first name"},
|
||||
{"last", T_OBJECT_EX, offsetof(Noddy, last), 0,
|
||||
"last name"},
|
||||
{"number", T_INT, offsetof(Noddy, number), 0,
|
||||
"noddy number"},
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
static PyObject *
|
||||
Noddy_name(Noddy* self)
|
||||
{
|
||||
static PyObject *format = NULL;
|
||||
PyObject *args, *result;
|
||||
|
||||
if (format == NULL) {
|
||||
format = PyString_FromString("%s %s");
|
||||
if (format == NULL)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (self->first == NULL) {
|
||||
PyErr_SetString(PyExc_AttributeError, "first");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (self->last == NULL) {
|
||||
PyErr_SetString(PyExc_AttributeError, "last");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
args = Py_BuildValue("OO", self->first, self->last);
|
||||
if (args == NULL)
|
||||
return NULL;
|
||||
|
||||
result = PyString_Format(format, args);
|
||||
Py_DECREF(args);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static PyMethodDef Noddy_methods[] = {
|
||||
{"name", (PyCFunction)Noddy_name, METH_NOARGS,
|
||||
"Return the name, combining the first and last name"
|
||||
},
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
static PyTypeObject NoddyType = {
|
||||
PyObject_HEAD_INIT(NULL)
|
||||
0, /*ob_size*/
|
||||
"noddy.Noddy", /*tp_name*/
|
||||
sizeof(Noddy), /*tp_basicsize*/
|
||||
0, /*tp_itemsize*/
|
||||
(destructor)Noddy_dealloc, /*tp_dealloc*/
|
||||
0, /*tp_print*/
|
||||
0, /*tp_getattr*/
|
||||
0, /*tp_setattr*/
|
||||
0, /*tp_compare*/
|
||||
0, /*tp_repr*/
|
||||
0, /*tp_as_number*/
|
||||
0, /*tp_as_sequence*/
|
||||
0, /*tp_as_mapping*/
|
||||
0, /*tp_hash */
|
||||
0, /*tp_call*/
|
||||
0, /*tp_str*/
|
||||
0, /*tp_getattro*/
|
||||
0, /*tp_setattro*/
|
||||
0, /*tp_as_buffer*/
|
||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
|
||||
"Noddy objects", /* tp_doc */
|
||||
0, /* tp_traverse */
|
||||
0, /* tp_clear */
|
||||
0, /* tp_richcompare */
|
||||
0, /* tp_weaklistoffset */
|
||||
0, /* tp_iter */
|
||||
0, /* tp_iternext */
|
||||
Noddy_methods, /* tp_methods */
|
||||
Noddy_members, /* tp_members */
|
||||
0, /* tp_getset */
|
||||
0, /* tp_base */
|
||||
0, /* tp_dict */
|
||||
0, /* tp_descr_get */
|
||||
0, /* tp_descr_set */
|
||||
0, /* tp_dictoffset */
|
||||
(initproc)Noddy_init, /* tp_init */
|
||||
0, /* tp_alloc */
|
||||
Noddy_new, /* tp_new */
|
||||
};
|
||||
|
||||
static PyMethodDef module_methods[] = {
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
|
||||
#define PyMODINIT_FUNC void
|
||||
#endif
|
||||
PyMODINIT_FUNC
|
||||
initnoddy2(void)
|
||||
{
|
||||
PyObject* m;
|
||||
|
||||
if (PyType_Ready(&NoddyType) < 0)
|
||||
return;
|
||||
|
||||
m = Py_InitModule3("noddy2", module_methods,
|
||||
"Example module that creates an extension type.");
|
||||
|
||||
if (m == NULL)
|
||||
return;
|
||||
|
||||
Py_INCREF(&NoddyType);
|
||||
PyModule_AddObject(m, "Noddy", (PyObject *)&NoddyType);
|
||||
}
|
||||
243
Doc-26/includes/noddy3.c
Normal file
243
Doc-26/includes/noddy3.c
Normal file
@@ -0,0 +1,243 @@
|
||||
#include <Python.h>
|
||||
#include "structmember.h"
|
||||
|
||||
typedef struct {
|
||||
PyObject_HEAD
|
||||
PyObject *first;
|
||||
PyObject *last;
|
||||
int number;
|
||||
} Noddy;
|
||||
|
||||
static void
|
||||
Noddy_dealloc(Noddy* self)
|
||||
{
|
||||
Py_XDECREF(self->first);
|
||||
Py_XDECREF(self->last);
|
||||
self->ob_type->tp_free((PyObject*)self);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||
{
|
||||
Noddy *self;
|
||||
|
||||
self = (Noddy *)type->tp_alloc(type, 0);
|
||||
if (self != NULL) {
|
||||
self->first = PyString_FromString("");
|
||||
if (self->first == NULL)
|
||||
{
|
||||
Py_DECREF(self);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
self->last = PyString_FromString("");
|
||||
if (self->last == NULL)
|
||||
{
|
||||
Py_DECREF(self);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
self->number = 0;
|
||||
}
|
||||
|
||||
return (PyObject *)self;
|
||||
}
|
||||
|
||||
static int
|
||||
Noddy_init(Noddy *self, PyObject *args, PyObject *kwds)
|
||||
{
|
||||
PyObject *first=NULL, *last=NULL, *tmp;
|
||||
|
||||
static char *kwlist[] = {"first", "last", "number", NULL};
|
||||
|
||||
if (! PyArg_ParseTupleAndKeywords(args, kwds, "|SSi", kwlist,
|
||||
&first, &last,
|
||||
&self->number))
|
||||
return -1;
|
||||
|
||||
if (first) {
|
||||
tmp = self->first;
|
||||
Py_INCREF(first);
|
||||
self->first = first;
|
||||
Py_DECREF(tmp);
|
||||
}
|
||||
|
||||
if (last) {
|
||||
tmp = self->last;
|
||||
Py_INCREF(last);
|
||||
self->last = last;
|
||||
Py_DECREF(tmp);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static PyMemberDef Noddy_members[] = {
|
||||
{"number", T_INT, offsetof(Noddy, number), 0,
|
||||
"noddy number"},
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
static PyObject *
|
||||
Noddy_getfirst(Noddy *self, void *closure)
|
||||
{
|
||||
Py_INCREF(self->first);
|
||||
return self->first;
|
||||
}
|
||||
|
||||
static int
|
||||
Noddy_setfirst(Noddy *self, PyObject *value, void *closure)
|
||||
{
|
||||
if (value == NULL) {
|
||||
PyErr_SetString(PyExc_TypeError, "Cannot delete the first attribute");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (! PyString_Check(value)) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"The first attribute value must be a string");
|
||||
return -1;
|
||||
}
|
||||
|
||||
Py_DECREF(self->first);
|
||||
Py_INCREF(value);
|
||||
self->first = value;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
Noddy_getlast(Noddy *self, void *closure)
|
||||
{
|
||||
Py_INCREF(self->last);
|
||||
return self->last;
|
||||
}
|
||||
|
||||
static int
|
||||
Noddy_setlast(Noddy *self, PyObject *value, void *closure)
|
||||
{
|
||||
if (value == NULL) {
|
||||
PyErr_SetString(PyExc_TypeError, "Cannot delete the last attribute");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (! PyString_Check(value)) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"The last attribute value must be a string");
|
||||
return -1;
|
||||
}
|
||||
|
||||
Py_DECREF(self->last);
|
||||
Py_INCREF(value);
|
||||
self->last = value;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static PyGetSetDef Noddy_getseters[] = {
|
||||
{"first",
|
||||
(getter)Noddy_getfirst, (setter)Noddy_setfirst,
|
||||
"first name",
|
||||
NULL},
|
||||
{"last",
|
||||
(getter)Noddy_getlast, (setter)Noddy_setlast,
|
||||
"last name",
|
||||
NULL},
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
static PyObject *
|
||||
Noddy_name(Noddy* self)
|
||||
{
|
||||
static PyObject *format = NULL;
|
||||
PyObject *args, *result;
|
||||
|
||||
if (format == NULL) {
|
||||
format = PyString_FromString("%s %s");
|
||||
if (format == NULL)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
args = Py_BuildValue("OO", self->first, self->last);
|
||||
if (args == NULL)
|
||||
return NULL;
|
||||
|
||||
result = PyString_Format(format, args);
|
||||
Py_DECREF(args);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static PyMethodDef Noddy_methods[] = {
|
||||
{"name", (PyCFunction)Noddy_name, METH_NOARGS,
|
||||
"Return the name, combining the first and last name"
|
||||
},
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
static PyTypeObject NoddyType = {
|
||||
PyObject_HEAD_INIT(NULL)
|
||||
0, /*ob_size*/
|
||||
"noddy.Noddy", /*tp_name*/
|
||||
sizeof(Noddy), /*tp_basicsize*/
|
||||
0, /*tp_itemsize*/
|
||||
(destructor)Noddy_dealloc, /*tp_dealloc*/
|
||||
0, /*tp_print*/
|
||||
0, /*tp_getattr*/
|
||||
0, /*tp_setattr*/
|
||||
0, /*tp_compare*/
|
||||
0, /*tp_repr*/
|
||||
0, /*tp_as_number*/
|
||||
0, /*tp_as_sequence*/
|
||||
0, /*tp_as_mapping*/
|
||||
0, /*tp_hash */
|
||||
0, /*tp_call*/
|
||||
0, /*tp_str*/
|
||||
0, /*tp_getattro*/
|
||||
0, /*tp_setattro*/
|
||||
0, /*tp_as_buffer*/
|
||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
|
||||
"Noddy objects", /* tp_doc */
|
||||
0, /* tp_traverse */
|
||||
0, /* tp_clear */
|
||||
0, /* tp_richcompare */
|
||||
0, /* tp_weaklistoffset */
|
||||
0, /* tp_iter */
|
||||
0, /* tp_iternext */
|
||||
Noddy_methods, /* tp_methods */
|
||||
Noddy_members, /* tp_members */
|
||||
Noddy_getseters, /* tp_getset */
|
||||
0, /* tp_base */
|
||||
0, /* tp_dict */
|
||||
0, /* tp_descr_get */
|
||||
0, /* tp_descr_set */
|
||||
0, /* tp_dictoffset */
|
||||
(initproc)Noddy_init, /* tp_init */
|
||||
0, /* tp_alloc */
|
||||
Noddy_new, /* tp_new */
|
||||
};
|
||||
|
||||
static PyMethodDef module_methods[] = {
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
|
||||
#define PyMODINIT_FUNC void
|
||||
#endif
|
||||
PyMODINIT_FUNC
|
||||
initnoddy3(void)
|
||||
{
|
||||
PyObject* m;
|
||||
|
||||
if (PyType_Ready(&NoddyType) < 0)
|
||||
return;
|
||||
|
||||
m = Py_InitModule3("noddy3", module_methods,
|
||||
"Example module that creates an extension type.");
|
||||
|
||||
if (m == NULL)
|
||||
return;
|
||||
|
||||
Py_INCREF(&NoddyType);
|
||||
PyModule_AddObject(m, "Noddy", (PyObject *)&NoddyType);
|
||||
}
|
||||
224
Doc-26/includes/noddy4.c
Normal file
224
Doc-26/includes/noddy4.c
Normal file
@@ -0,0 +1,224 @@
|
||||
#include <Python.h>
|
||||
#include "structmember.h"
|
||||
|
||||
typedef struct {
|
||||
PyObject_HEAD
|
||||
PyObject *first;
|
||||
PyObject *last;
|
||||
int number;
|
||||
} Noddy;
|
||||
|
||||
static int
|
||||
Noddy_traverse(Noddy *self, visitproc visit, void *arg)
|
||||
{
|
||||
int vret;
|
||||
|
||||
if (self->first) {
|
||||
vret = visit(self->first, arg);
|
||||
if (vret != 0)
|
||||
return vret;
|
||||
}
|
||||
if (self->last) {
|
||||
vret = visit(self->last, arg);
|
||||
if (vret != 0)
|
||||
return vret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
Noddy_clear(Noddy *self)
|
||||
{
|
||||
PyObject *tmp;
|
||||
|
||||
tmp = self->first;
|
||||
self->first = NULL;
|
||||
Py_XDECREF(tmp);
|
||||
|
||||
tmp = self->last;
|
||||
self->last = NULL;
|
||||
Py_XDECREF(tmp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
Noddy_dealloc(Noddy* self)
|
||||
{
|
||||
Noddy_clear(self);
|
||||
self->ob_type->tp_free((PyObject*)self);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||
{
|
||||
Noddy *self;
|
||||
|
||||
self = (Noddy *)type->tp_alloc(type, 0);
|
||||
if (self != NULL) {
|
||||
self->first = PyString_FromString("");
|
||||
if (self->first == NULL)
|
||||
{
|
||||
Py_DECREF(self);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
self->last = PyString_FromString("");
|
||||
if (self->last == NULL)
|
||||
{
|
||||
Py_DECREF(self);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
self->number = 0;
|
||||
}
|
||||
|
||||
return (PyObject *)self;
|
||||
}
|
||||
|
||||
static int
|
||||
Noddy_init(Noddy *self, PyObject *args, PyObject *kwds)
|
||||
{
|
||||
PyObject *first=NULL, *last=NULL, *tmp;
|
||||
|
||||
static char *kwlist[] = {"first", "last", "number", NULL};
|
||||
|
||||
if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist,
|
||||
&first, &last,
|
||||
&self->number))
|
||||
return -1;
|
||||
|
||||
if (first) {
|
||||
tmp = self->first;
|
||||
Py_INCREF(first);
|
||||
self->first = first;
|
||||
Py_XDECREF(tmp);
|
||||
}
|
||||
|
||||
if (last) {
|
||||
tmp = self->last;
|
||||
Py_INCREF(last);
|
||||
self->last = last;
|
||||
Py_XDECREF(tmp);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static PyMemberDef Noddy_members[] = {
|
||||
{"first", T_OBJECT_EX, offsetof(Noddy, first), 0,
|
||||
"first name"},
|
||||
{"last", T_OBJECT_EX, offsetof(Noddy, last), 0,
|
||||
"last name"},
|
||||
{"number", T_INT, offsetof(Noddy, number), 0,
|
||||
"noddy number"},
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
static PyObject *
|
||||
Noddy_name(Noddy* self)
|
||||
{
|
||||
static PyObject *format = NULL;
|
||||
PyObject *args, *result;
|
||||
|
||||
if (format == NULL) {
|
||||
format = PyString_FromString("%s %s");
|
||||
if (format == NULL)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (self->first == NULL) {
|
||||
PyErr_SetString(PyExc_AttributeError, "first");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (self->last == NULL) {
|
||||
PyErr_SetString(PyExc_AttributeError, "last");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
args = Py_BuildValue("OO", self->first, self->last);
|
||||
if (args == NULL)
|
||||
return NULL;
|
||||
|
||||
result = PyString_Format(format, args);
|
||||
Py_DECREF(args);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static PyMethodDef Noddy_methods[] = {
|
||||
{"name", (PyCFunction)Noddy_name, METH_NOARGS,
|
||||
"Return the name, combining the first and last name"
|
||||
},
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
static PyTypeObject NoddyType = {
|
||||
PyObject_HEAD_INIT(NULL)
|
||||
0, /*ob_size*/
|
||||
"noddy.Noddy", /*tp_name*/
|
||||
sizeof(Noddy), /*tp_basicsize*/
|
||||
0, /*tp_itemsize*/
|
||||
(destructor)Noddy_dealloc, /*tp_dealloc*/
|
||||
0, /*tp_print*/
|
||||
0, /*tp_getattr*/
|
||||
0, /*tp_setattr*/
|
||||
0, /*tp_compare*/
|
||||
0, /*tp_repr*/
|
||||
0, /*tp_as_number*/
|
||||
0, /*tp_as_sequence*/
|
||||
0, /*tp_as_mapping*/
|
||||
0, /*tp_hash */
|
||||
0, /*tp_call*/
|
||||
0, /*tp_str*/
|
||||
0, /*tp_getattro*/
|
||||
0, /*tp_setattro*/
|
||||
0, /*tp_as_buffer*/
|
||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
|
||||
"Noddy objects", /* tp_doc */
|
||||
(traverseproc)Noddy_traverse, /* tp_traverse */
|
||||
(inquiry)Noddy_clear, /* tp_clear */
|
||||
0, /* tp_richcompare */
|
||||
0, /* tp_weaklistoffset */
|
||||
0, /* tp_iter */
|
||||
0, /* tp_iternext */
|
||||
Noddy_methods, /* tp_methods */
|
||||
Noddy_members, /* tp_members */
|
||||
0, /* tp_getset */
|
||||
0, /* tp_base */
|
||||
0, /* tp_dict */
|
||||
0, /* tp_descr_get */
|
||||
0, /* tp_descr_set */
|
||||
0, /* tp_dictoffset */
|
||||
(initproc)Noddy_init, /* tp_init */
|
||||
0, /* tp_alloc */
|
||||
Noddy_new, /* tp_new */
|
||||
};
|
||||
|
||||
static PyMethodDef module_methods[] = {
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
|
||||
#define PyMODINIT_FUNC void
|
||||
#endif
|
||||
PyMODINIT_FUNC
|
||||
initnoddy4(void)
|
||||
{
|
||||
PyObject* m;
|
||||
|
||||
if (PyType_Ready(&NoddyType) < 0)
|
||||
return;
|
||||
|
||||
m = Py_InitModule3("noddy4", module_methods,
|
||||
"Example module that creates an extension type.");
|
||||
|
||||
if (m == NULL)
|
||||
return;
|
||||
|
||||
Py_INCREF(&NoddyType);
|
||||
PyModule_AddObject(m, "Noddy", (PyObject *)&NoddyType);
|
||||
}
|
||||
68
Doc-26/includes/run-func.c
Normal file
68
Doc-26/includes/run-func.c
Normal file
@@ -0,0 +1,68 @@
|
||||
#include <Python.h>
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
PyObject *pName, *pModule, *pDict, *pFunc;
|
||||
PyObject *pArgs, *pValue;
|
||||
int i;
|
||||
|
||||
if (argc < 3) {
|
||||
fprintf(stderr,"Usage: call pythonfile funcname [args]\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
Py_Initialize();
|
||||
pName = PyString_FromString(argv[1]);
|
||||
/* Error checking of pName left out */
|
||||
|
||||
pModule = PyImport_Import(pName);
|
||||
Py_DECREF(pName);
|
||||
|
||||
if (pModule != NULL) {
|
||||
pFunc = PyObject_GetAttrString(pModule, argv[2]);
|
||||
/* pFunc is a new reference */
|
||||
|
||||
if (pFunc && PyCallable_Check(pFunc)) {
|
||||
pArgs = PyTuple_New(argc - 3);
|
||||
for (i = 0; i < argc - 3; ++i) {
|
||||
pValue = PyInt_FromLong(atoi(argv[i + 3]));
|
||||
if (!pValue) {
|
||||
Py_DECREF(pArgs);
|
||||
Py_DECREF(pModule);
|
||||
fprintf(stderr, "Cannot convert argument\n");
|
||||
return 1;
|
||||
}
|
||||
/* pValue reference stolen here: */
|
||||
PyTuple_SetItem(pArgs, i, pValue);
|
||||
}
|
||||
pValue = PyObject_CallObject(pFunc, pArgs);
|
||||
Py_DECREF(pArgs);
|
||||
if (pValue != NULL) {
|
||||
printf("Result of call: %ld\n", PyInt_AsLong(pValue));
|
||||
Py_DECREF(pValue);
|
||||
}
|
||||
else {
|
||||
Py_DECREF(pFunc);
|
||||
Py_DECREF(pModule);
|
||||
PyErr_Print();
|
||||
fprintf(stderr,"Call failed\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (PyErr_Occurred())
|
||||
PyErr_Print();
|
||||
fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]);
|
||||
}
|
||||
Py_XDECREF(pFunc);
|
||||
Py_DECREF(pModule);
|
||||
}
|
||||
else {
|
||||
PyErr_Print();
|
||||
fprintf(stderr, "Failed to load \"%s\"\n", argv[1]);
|
||||
return 1;
|
||||
}
|
||||
Py_Finalize();
|
||||
return 0;
|
||||
}
|
||||
8
Doc-26/includes/setup.py
Normal file
8
Doc-26/includes/setup.py
Normal file
@@ -0,0 +1,8 @@
|
||||
from distutils.core import setup, Extension
|
||||
setup(name="noddy", version="1.0",
|
||||
ext_modules=[
|
||||
Extension("noddy", ["noddy.c"]),
|
||||
Extension("noddy2", ["noddy2.c"]),
|
||||
Extension("noddy3", ["noddy3.c"]),
|
||||
Extension("noddy4", ["noddy4.c"]),
|
||||
])
|
||||
91
Doc-26/includes/shoddy.c
Normal file
91
Doc-26/includes/shoddy.c
Normal file
@@ -0,0 +1,91 @@
|
||||
#include <Python.h>
|
||||
|
||||
typedef struct {
|
||||
PyListObject list;
|
||||
int state;
|
||||
} Shoddy;
|
||||
|
||||
|
||||
static PyObject *
|
||||
Shoddy_increment(Shoddy *self, PyObject *unused)
|
||||
{
|
||||
self->state++;
|
||||
return PyInt_FromLong(self->state);
|
||||
}
|
||||
|
||||
|
||||
static PyMethodDef Shoddy_methods[] = {
|
||||
{"increment", (PyCFunction)Shoddy_increment, METH_NOARGS,
|
||||
PyDoc_STR("increment state counter")},
|
||||
{NULL, NULL},
|
||||
};
|
||||
|
||||
static int
|
||||
Shoddy_init(Shoddy *self, PyObject *args, PyObject *kwds)
|
||||
{
|
||||
if (PyList_Type.tp_init((PyObject *)self, args, kwds) < 0)
|
||||
return -1;
|
||||
self->state = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static PyTypeObject ShoddyType = {
|
||||
PyObject_HEAD_INIT(NULL)
|
||||
0, /* ob_size */
|
||||
"shoddy.Shoddy", /* tp_name */
|
||||
sizeof(Shoddy), /* tp_basicsize */
|
||||
0, /* tp_itemsize */
|
||||
0, /* tp_dealloc */
|
||||
0, /* tp_print */
|
||||
0, /* tp_getattr */
|
||||
0, /* tp_setattr */
|
||||
0, /* tp_compare */
|
||||
0, /* tp_repr */
|
||||
0, /* tp_as_number */
|
||||
0, /* tp_as_sequence */
|
||||
0, /* tp_as_mapping */
|
||||
0, /* tp_hash */
|
||||
0, /* tp_call */
|
||||
0, /* tp_str */
|
||||
0, /* tp_getattro */
|
||||
0, /* tp_setattro */
|
||||
0, /* tp_as_buffer */
|
||||
Py_TPFLAGS_DEFAULT |
|
||||
Py_TPFLAGS_BASETYPE, /* tp_flags */
|
||||
0, /* tp_doc */
|
||||
0, /* tp_traverse */
|
||||
0, /* tp_clear */
|
||||
0, /* tp_richcompare */
|
||||
0, /* tp_weaklistoffset */
|
||||
0, /* tp_iter */
|
||||
0, /* tp_iternext */
|
||||
Shoddy_methods, /* tp_methods */
|
||||
0, /* tp_members */
|
||||
0, /* tp_getset */
|
||||
0, /* tp_base */
|
||||
0, /* tp_dict */
|
||||
0, /* tp_descr_get */
|
||||
0, /* tp_descr_set */
|
||||
0, /* tp_dictoffset */
|
||||
(initproc)Shoddy_init, /* tp_init */
|
||||
0, /* tp_alloc */
|
||||
0, /* tp_new */
|
||||
};
|
||||
|
||||
PyMODINIT_FUNC
|
||||
initshoddy(void)
|
||||
{
|
||||
PyObject *m;
|
||||
|
||||
ShoddyType.tp_base = &PyList_Type;
|
||||
if (PyType_Ready(&ShoddyType) < 0)
|
||||
return;
|
||||
|
||||
m = Py_InitModule3("shoddy", NULL, "Shoddy module");
|
||||
if (m == NULL)
|
||||
return;
|
||||
|
||||
Py_INCREF(&ShoddyType);
|
||||
PyModule_AddObject(m, "Shoddy", (PyObject *) &ShoddyType);
|
||||
}
|
||||
14
Doc-26/includes/sqlite3/adapter_datetime.py
Normal file
14
Doc-26/includes/sqlite3/adapter_datetime.py
Normal file
@@ -0,0 +1,14 @@
|
||||
import sqlite3
|
||||
import datetime, time
|
||||
|
||||
def adapt_datetime(ts):
|
||||
return time.mktime(ts.timetuple())
|
||||
|
||||
sqlite3.register_adapter(datetime.datetime, adapt_datetime)
|
||||
|
||||
con = sqlite3.connect(":memory:")
|
||||
cur = con.cursor()
|
||||
|
||||
now = datetime.datetime.now()
|
||||
cur.execute("select ?", (now,))
|
||||
print cur.fetchone()[0]
|
||||
16
Doc-26/includes/sqlite3/adapter_point_1.py
Normal file
16
Doc-26/includes/sqlite3/adapter_point_1.py
Normal file
@@ -0,0 +1,16 @@
|
||||
import sqlite3
|
||||
|
||||
class Point(object):
|
||||
def __init__(self, x, y):
|
||||
self.x, self.y = x, y
|
||||
|
||||
def __conform__(self, protocol):
|
||||
if protocol is sqlite3.PrepareProtocol:
|
||||
return "%f;%f" % (self.x, self.y)
|
||||
|
||||
con = sqlite3.connect(":memory:")
|
||||
cur = con.cursor()
|
||||
|
||||
p = Point(4.0, -3.2)
|
||||
cur.execute("select ?", (p,))
|
||||
print cur.fetchone()[0]
|
||||
17
Doc-26/includes/sqlite3/adapter_point_2.py
Normal file
17
Doc-26/includes/sqlite3/adapter_point_2.py
Normal file
@@ -0,0 +1,17 @@
|
||||
import sqlite3
|
||||
|
||||
class Point(object):
|
||||
def __init__(self, x, y):
|
||||
self.x, self.y = x, y
|
||||
|
||||
def adapt_point(point):
|
||||
return "%f;%f" % (point.x, point.y)
|
||||
|
||||
sqlite3.register_adapter(Point, adapt_point)
|
||||
|
||||
con = sqlite3.connect(":memory:")
|
||||
cur = con.cursor()
|
||||
|
||||
p = Point(4.0, -3.2)
|
||||
cur.execute("select ?", (p,))
|
||||
print cur.fetchone()[0]
|
||||
15
Doc-26/includes/sqlite3/collation_reverse.py
Normal file
15
Doc-26/includes/sqlite3/collation_reverse.py
Normal file
@@ -0,0 +1,15 @@
|
||||
import sqlite3
|
||||
|
||||
def collate_reverse(string1, string2):
|
||||
return -cmp(string1, string2)
|
||||
|
||||
con = sqlite3.connect(":memory:")
|
||||
con.create_collation("reverse", collate_reverse)
|
||||
|
||||
cur = con.cursor()
|
||||
cur.execute("create table test(x)")
|
||||
cur.executemany("insert into test(x) values (?)", [("a",), ("b",)])
|
||||
cur.execute("select x from test order by x collate reverse")
|
||||
for row in cur:
|
||||
print row
|
||||
con.close()
|
||||
30
Doc-26/includes/sqlite3/complete_statement.py
Normal file
30
Doc-26/includes/sqlite3/complete_statement.py
Normal file
@@ -0,0 +1,30 @@
|
||||
# A minimal SQLite shell for experiments
|
||||
|
||||
import sqlite3
|
||||
|
||||
con = sqlite3.connect(":memory:")
|
||||
con.isolation_level = None
|
||||
cur = con.cursor()
|
||||
|
||||
buffer = ""
|
||||
|
||||
print "Enter your SQL commands to execute in sqlite3."
|
||||
print "Enter a blank line to exit."
|
||||
|
||||
while True:
|
||||
line = raw_input()
|
||||
if line == "":
|
||||
break
|
||||
buffer += line
|
||||
if sqlite3.complete_statement(buffer):
|
||||
try:
|
||||
buffer = buffer.strip()
|
||||
cur.execute(buffer)
|
||||
|
||||
if buffer.lstrip().upper().startswith("SELECT"):
|
||||
print cur.fetchall()
|
||||
except sqlite3.Error, e:
|
||||
print "An error occurred:", e.args[0]
|
||||
buffer = ""
|
||||
|
||||
con.close()
|
||||
3
Doc-26/includes/sqlite3/connect_db_1.py
Normal file
3
Doc-26/includes/sqlite3/connect_db_1.py
Normal file
@@ -0,0 +1,3 @@
|
||||
import sqlite3
|
||||
|
||||
con = sqlite3.connect("mydb")
|
||||
3
Doc-26/includes/sqlite3/connect_db_2.py
Normal file
3
Doc-26/includes/sqlite3/connect_db_2.py
Normal file
@@ -0,0 +1,3 @@
|
||||
import sqlite3
|
||||
|
||||
con = sqlite3.connect(":memory:")
|
||||
47
Doc-26/includes/sqlite3/converter_point.py
Normal file
47
Doc-26/includes/sqlite3/converter_point.py
Normal file
@@ -0,0 +1,47 @@
|
||||
import sqlite3
|
||||
|
||||
class Point(object):
|
||||
def __init__(self, x, y):
|
||||
self.x, self.y = x, y
|
||||
|
||||
def __repr__(self):
|
||||
return "(%f;%f)" % (self.x, self.y)
|
||||
|
||||
def adapt_point(point):
|
||||
return "%f;%f" % (point.x, point.y)
|
||||
|
||||
def convert_point(s):
|
||||
x, y = map(float, s.split(";"))
|
||||
return Point(x, y)
|
||||
|
||||
# Register the adapter
|
||||
sqlite3.register_adapter(Point, adapt_point)
|
||||
|
||||
# Register the converter
|
||||
sqlite3.register_converter("point", convert_point)
|
||||
|
||||
p = Point(4.0, -3.2)
|
||||
|
||||
#########################
|
||||
# 1) Using declared types
|
||||
con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)
|
||||
cur = con.cursor()
|
||||
cur.execute("create table test(p point)")
|
||||
|
||||
cur.execute("insert into test(p) values (?)", (p,))
|
||||
cur.execute("select p from test")
|
||||
print "with declared types:", cur.fetchone()[0]
|
||||
cur.close()
|
||||
con.close()
|
||||
|
||||
#######################
|
||||
# 1) Using column names
|
||||
con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_COLNAMES)
|
||||
cur = con.cursor()
|
||||
cur.execute("create table test(p)")
|
||||
|
||||
cur.execute("insert into test(p) values (?)", (p,))
|
||||
cur.execute('select p as "p [point]" from test')
|
||||
print "with column names:", cur.fetchone()[0]
|
||||
cur.close()
|
||||
con.close()
|
||||
15
Doc-26/includes/sqlite3/countcursors.py
Normal file
15
Doc-26/includes/sqlite3/countcursors.py
Normal file
@@ -0,0 +1,15 @@
|
||||
import sqlite3
|
||||
|
||||
class CountCursorsConnection(sqlite3.Connection):
|
||||
def __init__(self, *args, **kwargs):
|
||||
sqlite3.Connection.__init__(self, *args, **kwargs)
|
||||
self.numcursors = 0
|
||||
|
||||
def cursor(self, *args, **kwargs):
|
||||
self.numcursors += 1
|
||||
return sqlite3.Connection.cursor(self, *args, **kwargs)
|
||||
|
||||
con = sqlite3.connect(":memory:", factory=CountCursorsConnection)
|
||||
cur1 = con.cursor()
|
||||
cur2 = con.cursor()
|
||||
print con.numcursors
|
||||
28
Doc-26/includes/sqlite3/createdb.py
Normal file
28
Doc-26/includes/sqlite3/createdb.py
Normal file
@@ -0,0 +1,28 @@
|
||||
# Not referenced from the documentation, but builds the database file the other
|
||||
# code snippets expect.
|
||||
|
||||
import sqlite3
|
||||
import os
|
||||
|
||||
DB_FILE = "mydb"
|
||||
|
||||
if os.path.exists(DB_FILE):
|
||||
os.remove(DB_FILE)
|
||||
|
||||
con = sqlite3.connect(DB_FILE)
|
||||
cur = con.cursor()
|
||||
cur.execute("""
|
||||
create table people
|
||||
(
|
||||
name_last varchar(20),
|
||||
age integer
|
||||
)
|
||||
""")
|
||||
|
||||
cur.execute("insert into people (name_last, age) values ('Yeltsin', 72)")
|
||||
cur.execute("insert into people (name_last, age) values ('Putin', 51)")
|
||||
|
||||
con.commit()
|
||||
|
||||
cur.close()
|
||||
con.close()
|
||||
17
Doc-26/includes/sqlite3/execsql_fetchonerow.py
Normal file
17
Doc-26/includes/sqlite3/execsql_fetchonerow.py
Normal file
@@ -0,0 +1,17 @@
|
||||
import sqlite3
|
||||
|
||||
con = sqlite3.connect("mydb")
|
||||
|
||||
cur = con.cursor()
|
||||
SELECT = "select name_last, age from people order by age, name_last"
|
||||
|
||||
# 1. Iterate over the rows available from the cursor, unpacking the
|
||||
# resulting sequences to yield their elements (name_last, age):
|
||||
cur.execute(SELECT)
|
||||
for (name_last, age) in cur:
|
||||
print '%s is %d years old.' % (name_last, age)
|
||||
|
||||
# 2. Equivalently:
|
||||
cur.execute(SELECT)
|
||||
for row in cur:
|
||||
print '%s is %d years old.' % (row[0], row[1])
|
||||
13
Doc-26/includes/sqlite3/execsql_printall_1.py
Normal file
13
Doc-26/includes/sqlite3/execsql_printall_1.py
Normal file
@@ -0,0 +1,13 @@
|
||||
import sqlite3
|
||||
|
||||
# Create a connection to the database file "mydb":
|
||||
con = sqlite3.connect("mydb")
|
||||
|
||||
# Get a Cursor object that operates in the context of Connection con:
|
||||
cur = con.cursor()
|
||||
|
||||
# Execute the SELECT statement:
|
||||
cur.execute("select * from people order by age")
|
||||
|
||||
# Retrieve all rows as a sequence and print that sequence:
|
||||
print cur.fetchall()
|
||||
11
Doc-26/includes/sqlite3/execute_1.py
Normal file
11
Doc-26/includes/sqlite3/execute_1.py
Normal file
@@ -0,0 +1,11 @@
|
||||
import sqlite3
|
||||
|
||||
con = sqlite3.connect("mydb")
|
||||
|
||||
cur = con.cursor()
|
||||
|
||||
who = "Yeltsin"
|
||||
age = 72
|
||||
|
||||
cur.execute("select name_last, age from people where name_last=? and age=?", (who, age))
|
||||
print cur.fetchone()
|
||||
12
Doc-26/includes/sqlite3/execute_2.py
Normal file
12
Doc-26/includes/sqlite3/execute_2.py
Normal file
@@ -0,0 +1,12 @@
|
||||
import sqlite3
|
||||
|
||||
con = sqlite3.connect("mydb")
|
||||
|
||||
cur = con.cursor()
|
||||
|
||||
who = "Yeltsin"
|
||||
age = 72
|
||||
|
||||
cur.execute("select name_last, age from people where name_last=:who and age=:age",
|
||||
{"who": who, "age": age})
|
||||
print cur.fetchone()
|
||||
12
Doc-26/includes/sqlite3/execute_3.py
Normal file
12
Doc-26/includes/sqlite3/execute_3.py
Normal file
@@ -0,0 +1,12 @@
|
||||
import sqlite3
|
||||
|
||||
con = sqlite3.connect("mydb")
|
||||
|
||||
cur = con.cursor()
|
||||
|
||||
who = "Yeltsin"
|
||||
age = 72
|
||||
|
||||
cur.execute("select name_last, age from people where name_last=:who and age=:age",
|
||||
locals())
|
||||
print cur.fetchone()
|
||||
24
Doc-26/includes/sqlite3/executemany_1.py
Normal file
24
Doc-26/includes/sqlite3/executemany_1.py
Normal file
@@ -0,0 +1,24 @@
|
||||
import sqlite3
|
||||
|
||||
class IterChars:
|
||||
def __init__(self):
|
||||
self.count = ord('a')
|
||||
|
||||
def __iter__(self):
|
||||
return self
|
||||
|
||||
def next(self):
|
||||
if self.count > ord('z'):
|
||||
raise StopIteration
|
||||
self.count += 1
|
||||
return (chr(self.count - 1),) # this is a 1-tuple
|
||||
|
||||
con = sqlite3.connect(":memory:")
|
||||
cur = con.cursor()
|
||||
cur.execute("create table characters(c)")
|
||||
|
||||
theIter = IterChars()
|
||||
cur.executemany("insert into characters(c) values (?)", theIter)
|
||||
|
||||
cur.execute("select c from characters")
|
||||
print cur.fetchall()
|
||||
15
Doc-26/includes/sqlite3/executemany_2.py
Normal file
15
Doc-26/includes/sqlite3/executemany_2.py
Normal file
@@ -0,0 +1,15 @@
|
||||
import sqlite3
|
||||
|
||||
def char_generator():
|
||||
import string
|
||||
for c in string.letters[:26]:
|
||||
yield (c,)
|
||||
|
||||
con = sqlite3.connect(":memory:")
|
||||
cur = con.cursor()
|
||||
cur.execute("create table characters(c)")
|
||||
|
||||
cur.executemany("insert into characters(c) values (?)", char_generator())
|
||||
|
||||
cur.execute("select c from characters")
|
||||
print cur.fetchall()
|
||||
24
Doc-26/includes/sqlite3/executescript.py
Normal file
24
Doc-26/includes/sqlite3/executescript.py
Normal file
@@ -0,0 +1,24 @@
|
||||
import sqlite3
|
||||
|
||||
con = sqlite3.connect(":memory:")
|
||||
cur = con.cursor()
|
||||
cur.executescript("""
|
||||
create table person(
|
||||
firstname,
|
||||
lastname,
|
||||
age
|
||||
);
|
||||
|
||||
create table book(
|
||||
title,
|
||||
author,
|
||||
published
|
||||
);
|
||||
|
||||
insert into book(title, author, published)
|
||||
values (
|
||||
'Dirk Gently''s Holistic Detective Agency',
|
||||
'Douglas Adams',
|
||||
1987
|
||||
);
|
||||
""")
|
||||
16
Doc-26/includes/sqlite3/insert_more_people.py
Normal file
16
Doc-26/includes/sqlite3/insert_more_people.py
Normal file
@@ -0,0 +1,16 @@
|
||||
import sqlite3
|
||||
|
||||
con = sqlite3.connect("mydb")
|
||||
|
||||
cur = con.cursor()
|
||||
|
||||
newPeople = (
|
||||
('Lebed' , 53),
|
||||
('Zhirinovsky' , 57),
|
||||
)
|
||||
|
||||
for person in newPeople:
|
||||
cur.execute("insert into people (name_last, age) values (?, ?)", person)
|
||||
|
||||
# The changes will not be saved unless the transaction is committed explicitly:
|
||||
con.commit()
|
||||
11
Doc-26/includes/sqlite3/md5func.py
Normal file
11
Doc-26/includes/sqlite3/md5func.py
Normal file
@@ -0,0 +1,11 @@
|
||||
import sqlite3
|
||||
import md5
|
||||
|
||||
def md5sum(t):
|
||||
return md5.md5(t).hexdigest()
|
||||
|
||||
con = sqlite3.connect(":memory:")
|
||||
con.create_function("md5", 1, md5sum)
|
||||
cur = con.cursor()
|
||||
cur.execute("select md5(?)", ("foo",))
|
||||
print cur.fetchone()[0]
|
||||
20
Doc-26/includes/sqlite3/mysumaggr.py
Normal file
20
Doc-26/includes/sqlite3/mysumaggr.py
Normal file
@@ -0,0 +1,20 @@
|
||||
import sqlite3
|
||||
|
||||
class MySum:
|
||||
def __init__(self):
|
||||
self.count = 0
|
||||
|
||||
def step(self, value):
|
||||
self.count += value
|
||||
|
||||
def finalize(self):
|
||||
return self.count
|
||||
|
||||
con = sqlite3.connect(":memory:")
|
||||
con.create_aggregate("mysum", 1, MySum)
|
||||
cur = con.cursor()
|
||||
cur.execute("create table test(i)")
|
||||
cur.execute("insert into test(i) values (1)")
|
||||
cur.execute("insert into test(i) values (2)")
|
||||
cur.execute("select mysum(i) from test")
|
||||
print cur.fetchone()[0]
|
||||
8
Doc-26/includes/sqlite3/parse_colnames.py
Normal file
8
Doc-26/includes/sqlite3/parse_colnames.py
Normal file
@@ -0,0 +1,8 @@
|
||||
import sqlite3
|
||||
import datetime
|
||||
|
||||
con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_COLNAMES)
|
||||
cur = con.cursor()
|
||||
cur.execute('select ? as "x [timestamp]"', (datetime.datetime.now(),))
|
||||
dt = cur.fetchone()[0]
|
||||
print dt, type(dt)
|
||||
20
Doc-26/includes/sqlite3/pysqlite_datetime.py
Normal file
20
Doc-26/includes/sqlite3/pysqlite_datetime.py
Normal file
@@ -0,0 +1,20 @@
|
||||
import sqlite3
|
||||
import datetime
|
||||
|
||||
con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
|
||||
cur = con.cursor()
|
||||
cur.execute("create table test(d date, ts timestamp)")
|
||||
|
||||
today = datetime.date.today()
|
||||
now = datetime.datetime.now()
|
||||
|
||||
cur.execute("insert into test(d, ts) values (?, ?)", (today, now))
|
||||
cur.execute("select d, ts from test")
|
||||
row = cur.fetchone()
|
||||
print today, "=>", row[0], type(row[0])
|
||||
print now, "=>", row[1], type(row[1])
|
||||
|
||||
cur.execute('select current_date as "d [date]", current_timestamp as "ts [timestamp]"')
|
||||
row = cur.fetchone()
|
||||
print "current_date", row[0], type(row[0])
|
||||
print "current_timestamp", row[1], type(row[1])
|
||||
13
Doc-26/includes/sqlite3/row_factory.py
Normal file
13
Doc-26/includes/sqlite3/row_factory.py
Normal file
@@ -0,0 +1,13 @@
|
||||
import sqlite3
|
||||
|
||||
def dict_factory(cursor, row):
|
||||
d = {}
|
||||
for idx, col in enumerate(cursor.description):
|
||||
d[col[0]] = row[idx]
|
||||
return d
|
||||
|
||||
con = sqlite3.connect(":memory:")
|
||||
con.row_factory = dict_factory
|
||||
cur = con.cursor()
|
||||
cur.execute("select 1 as a")
|
||||
print cur.fetchone()["a"]
|
||||
12
Doc-26/includes/sqlite3/rowclass.py
Normal file
12
Doc-26/includes/sqlite3/rowclass.py
Normal file
@@ -0,0 +1,12 @@
|
||||
import sqlite3
|
||||
|
||||
con = sqlite3.connect("mydb")
|
||||
con.row_factory = sqlite3.Row
|
||||
|
||||
cur = con.cursor()
|
||||
cur.execute("select name_last, age from people")
|
||||
for row in cur:
|
||||
assert row[0] == row["name_last"]
|
||||
assert row["name_last"] == row["nAmE_lAsT"]
|
||||
assert row[1] == row["age"]
|
||||
assert row[1] == row["AgE"]
|
||||
6
Doc-26/includes/sqlite3/shared_cache.py
Normal file
6
Doc-26/includes/sqlite3/shared_cache.py
Normal file
@@ -0,0 +1,6 @@
|
||||
import sqlite3
|
||||
|
||||
# The shared cache is only available in SQLite versions 3.3.3 or later
|
||||
# See the SQLite documentaton for details.
|
||||
|
||||
sqlite3.enable_shared_cache(True)
|
||||
21
Doc-26/includes/sqlite3/shortcut_methods.py
Normal file
21
Doc-26/includes/sqlite3/shortcut_methods.py
Normal file
@@ -0,0 +1,21 @@
|
||||
import sqlite3
|
||||
|
||||
persons = [
|
||||
("Hugo", "Boss"),
|
||||
("Calvin", "Klein")
|
||||
]
|
||||
|
||||
con = sqlite3.connect(":memory:")
|
||||
|
||||
# Create the table
|
||||
con.execute("create table person(firstname, lastname)")
|
||||
|
||||
# Fill the table
|
||||
con.executemany("insert into person(firstname, lastname) values (?, ?)", persons)
|
||||
|
||||
# Print the table contents
|
||||
for row in con.execute("select firstname, lastname from person"):
|
||||
print row
|
||||
|
||||
# Using a dummy WHERE clause to not let SQLite take the shortcut table deletes.
|
||||
print "I just deleted", con.execute("delete from person where 1=1").rowcount, "rows"
|
||||
26
Doc-26/includes/sqlite3/simple_tableprinter.py
Normal file
26
Doc-26/includes/sqlite3/simple_tableprinter.py
Normal file
@@ -0,0 +1,26 @@
|
||||
import sqlite3
|
||||
|
||||
FIELD_MAX_WIDTH = 20
|
||||
TABLE_NAME = 'people'
|
||||
SELECT = 'select * from %s order by age, name_last' % TABLE_NAME
|
||||
|
||||
con = sqlite3.connect("mydb")
|
||||
|
||||
cur = con.cursor()
|
||||
cur.execute(SELECT)
|
||||
|
||||
# Print a header.
|
||||
for fieldDesc in cur.description:
|
||||
print fieldDesc[0].ljust(FIELD_MAX_WIDTH) ,
|
||||
print # Finish the header with a newline.
|
||||
print '-' * 78
|
||||
|
||||
# For each row, print the value of each field left-justified within
|
||||
# the maximum possible width of that field.
|
||||
fieldIndices = range(len(cur.description))
|
||||
for row in cur:
|
||||
for fieldIndex in fieldIndices:
|
||||
fieldValue = str(row[fieldIndex])
|
||||
print fieldValue.ljust(FIELD_MAX_WIDTH) ,
|
||||
|
||||
print # Finish the row with a newline.
|
||||
42
Doc-26/includes/sqlite3/text_factory.py
Normal file
42
Doc-26/includes/sqlite3/text_factory.py
Normal file
@@ -0,0 +1,42 @@
|
||||
import sqlite3
|
||||
|
||||
con = sqlite3.connect(":memory:")
|
||||
cur = con.cursor()
|
||||
|
||||
# Create the table
|
||||
con.execute("create table person(lastname, firstname)")
|
||||
|
||||
AUSTRIA = u"\xd6sterreich"
|
||||
|
||||
# by default, rows are returned as Unicode
|
||||
cur.execute("select ?", (AUSTRIA,))
|
||||
row = cur.fetchone()
|
||||
assert row[0] == AUSTRIA
|
||||
|
||||
# but we can make pysqlite always return bytestrings ...
|
||||
con.text_factory = str
|
||||
cur.execute("select ?", (AUSTRIA,))
|
||||
row = cur.fetchone()
|
||||
assert type(row[0]) == str
|
||||
# the bytestrings will be encoded in UTF-8, unless you stored garbage in the
|
||||
# database ...
|
||||
assert row[0] == AUSTRIA.encode("utf-8")
|
||||
|
||||
# we can also implement a custom text_factory ...
|
||||
# here we implement one that will ignore Unicode characters that cannot be
|
||||
# decoded from UTF-8
|
||||
con.text_factory = lambda x: unicode(x, "utf-8", "ignore")
|
||||
cur.execute("select ?", ("this is latin1 and would normally create errors" + u"\xe4\xf6\xfc".encode("latin1"),))
|
||||
row = cur.fetchone()
|
||||
assert type(row[0]) == unicode
|
||||
|
||||
# pysqlite offers a builtin optimized text_factory that will return bytestring
|
||||
# objects, if the data is in ASCII only, and otherwise return unicode objects
|
||||
con.text_factory = sqlite3.OptimizedUnicode
|
||||
cur.execute("select ?", (AUSTRIA,))
|
||||
row = cur.fetchone()
|
||||
assert type(row[0]) == unicode
|
||||
|
||||
cur.execute("select ?", ("Germany",))
|
||||
row = cur.fetchone()
|
||||
assert type(row[0]) == str
|
||||
213
Doc-26/includes/test.py
Normal file
213
Doc-26/includes/test.py
Normal file
@@ -0,0 +1,213 @@
|
||||
"""Test module for the noddy examples
|
||||
|
||||
Noddy 1:
|
||||
|
||||
>>> import noddy
|
||||
>>> n1 = noddy.Noddy()
|
||||
>>> n2 = noddy.Noddy()
|
||||
>>> del n1
|
||||
>>> del n2
|
||||
|
||||
|
||||
Noddy 2
|
||||
|
||||
>>> import noddy2
|
||||
>>> n1 = noddy2.Noddy('jim', 'fulton', 42)
|
||||
>>> n1.first
|
||||
'jim'
|
||||
>>> n1.last
|
||||
'fulton'
|
||||
>>> n1.number
|
||||
42
|
||||
>>> n1.name()
|
||||
'jim fulton'
|
||||
>>> n1.first = 'will'
|
||||
>>> n1.name()
|
||||
'will fulton'
|
||||
>>> n1.last = 'tell'
|
||||
>>> n1.name()
|
||||
'will tell'
|
||||
>>> del n1.first
|
||||
>>> n1.name()
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
AttributeError: first
|
||||
>>> n1.first
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
AttributeError: first
|
||||
>>> n1.first = 'drew'
|
||||
>>> n1.first
|
||||
'drew'
|
||||
>>> del n1.number
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
TypeError: can't delete numeric/char attribute
|
||||
>>> n1.number=2
|
||||
>>> n1.number
|
||||
2
|
||||
>>> n1.first = 42
|
||||
>>> n1.name()
|
||||
'42 tell'
|
||||
>>> n2 = noddy2.Noddy()
|
||||
>>> n2.name()
|
||||
' '
|
||||
>>> n2.first
|
||||
''
|
||||
>>> n2.last
|
||||
''
|
||||
>>> del n2.first
|
||||
>>> n2.first
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
AttributeError: first
|
||||
>>> n2.first
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
AttributeError: first
|
||||
>>> n2.name()
|
||||
Traceback (most recent call last):
|
||||
File "<stdin>", line 1, in ?
|
||||
AttributeError: first
|
||||
>>> n2.number
|
||||
0
|
||||
>>> n3 = noddy2.Noddy('jim', 'fulton', 'waaa')
|
||||
Traceback (most recent call last):
|
||||
File "<stdin>", line 1, in ?
|
||||
TypeError: an integer is required
|
||||
>>> del n1
|
||||
>>> del n2
|
||||
|
||||
|
||||
Noddy 3
|
||||
|
||||
>>> import noddy3
|
||||
>>> n1 = noddy3.Noddy('jim', 'fulton', 42)
|
||||
>>> n1 = noddy3.Noddy('jim', 'fulton', 42)
|
||||
>>> n1.name()
|
||||
'jim fulton'
|
||||
>>> del n1.first
|
||||
Traceback (most recent call last):
|
||||
File "<stdin>", line 1, in ?
|
||||
TypeError: Cannot delete the first attribute
|
||||
>>> n1.first = 42
|
||||
Traceback (most recent call last):
|
||||
File "<stdin>", line 1, in ?
|
||||
TypeError: The first attribute value must be a string
|
||||
>>> n1.first = 'will'
|
||||
>>> n1.name()
|
||||
'will fulton'
|
||||
>>> n2 = noddy3.Noddy()
|
||||
>>> n2 = noddy3.Noddy()
|
||||
>>> n2 = noddy3.Noddy()
|
||||
>>> n3 = noddy3.Noddy('jim', 'fulton', 'waaa')
|
||||
Traceback (most recent call last):
|
||||
File "<stdin>", line 1, in ?
|
||||
TypeError: an integer is required
|
||||
>>> del n1
|
||||
>>> del n2
|
||||
|
||||
Noddy 4
|
||||
|
||||
>>> import noddy4
|
||||
>>> n1 = noddy4.Noddy('jim', 'fulton', 42)
|
||||
>>> n1.first
|
||||
'jim'
|
||||
>>> n1.last
|
||||
'fulton'
|
||||
>>> n1.number
|
||||
42
|
||||
>>> n1.name()
|
||||
'jim fulton'
|
||||
>>> n1.first = 'will'
|
||||
>>> n1.name()
|
||||
'will fulton'
|
||||
>>> n1.last = 'tell'
|
||||
>>> n1.name()
|
||||
'will tell'
|
||||
>>> del n1.first
|
||||
>>> n1.name()
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
AttributeError: first
|
||||
>>> n1.first
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
AttributeError: first
|
||||
>>> n1.first = 'drew'
|
||||
>>> n1.first
|
||||
'drew'
|
||||
>>> del n1.number
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
TypeError: can't delete numeric/char attribute
|
||||
>>> n1.number=2
|
||||
>>> n1.number
|
||||
2
|
||||
>>> n1.first = 42
|
||||
>>> n1.name()
|
||||
'42 tell'
|
||||
>>> n2 = noddy4.Noddy()
|
||||
>>> n2 = noddy4.Noddy()
|
||||
>>> n2 = noddy4.Noddy()
|
||||
>>> n2 = noddy4.Noddy()
|
||||
>>> n2.name()
|
||||
' '
|
||||
>>> n2.first
|
||||
''
|
||||
>>> n2.last
|
||||
''
|
||||
>>> del n2.first
|
||||
>>> n2.first
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
AttributeError: first
|
||||
>>> n2.first
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
AttributeError: first
|
||||
>>> n2.name()
|
||||
Traceback (most recent call last):
|
||||
File "<stdin>", line 1, in ?
|
||||
AttributeError: first
|
||||
>>> n2.number
|
||||
0
|
||||
>>> n3 = noddy4.Noddy('jim', 'fulton', 'waaa')
|
||||
Traceback (most recent call last):
|
||||
File "<stdin>", line 1, in ?
|
||||
TypeError: an integer is required
|
||||
|
||||
|
||||
Test cyclic gc(?)
|
||||
|
||||
>>> import gc
|
||||
>>> gc.disable()
|
||||
|
||||
>>> x = []
|
||||
>>> l = [x]
|
||||
>>> n2.first = l
|
||||
>>> n2.first
|
||||
[[]]
|
||||
>>> l.append(n2)
|
||||
>>> del l
|
||||
>>> del n1
|
||||
>>> del n2
|
||||
>>> sys.getrefcount(x)
|
||||
3
|
||||
>>> ignore = gc.collect()
|
||||
>>> sys.getrefcount(x)
|
||||
2
|
||||
|
||||
>>> gc.enable()
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
from distutils.util import get_platform
|
||||
PLAT_SPEC = "%s-%s" % (get_platform(), sys.version[0:3])
|
||||
src = os.path.join("build", "lib.%s" % PLAT_SPEC)
|
||||
sys.path.append(src)
|
||||
|
||||
if __name__ == "__main__":
|
||||
import doctest, __main__
|
||||
doctest.testmod(__main__)
|
||||
76
Doc-26/includes/typestruct.h
Normal file
76
Doc-26/includes/typestruct.h
Normal file
@@ -0,0 +1,76 @@
|
||||
typedef struct _typeobject {
|
||||
PyObject_VAR_HEAD
|
||||
char *tp_name; /* For printing, in format "<module>.<name>" */
|
||||
int tp_basicsize, tp_itemsize; /* For allocation */
|
||||
|
||||
/* Methods to implement standard operations */
|
||||
|
||||
destructor tp_dealloc;
|
||||
printfunc tp_print;
|
||||
getattrfunc tp_getattr;
|
||||
setattrfunc tp_setattr;
|
||||
cmpfunc tp_compare;
|
||||
reprfunc tp_repr;
|
||||
|
||||
/* Method suites for standard classes */
|
||||
|
||||
PyNumberMethods *tp_as_number;
|
||||
PySequenceMethods *tp_as_sequence;
|
||||
PyMappingMethods *tp_as_mapping;
|
||||
|
||||
/* More standard operations (here for binary compatibility) */
|
||||
|
||||
hashfunc tp_hash;
|
||||
ternaryfunc tp_call;
|
||||
reprfunc tp_str;
|
||||
getattrofunc tp_getattro;
|
||||
setattrofunc tp_setattro;
|
||||
|
||||
/* Functions to access object as input/output buffer */
|
||||
PyBufferProcs *tp_as_buffer;
|
||||
|
||||
/* Flags to define presence of optional/expanded features */
|
||||
long tp_flags;
|
||||
|
||||
char *tp_doc; /* Documentation string */
|
||||
|
||||
/* Assigned meaning in release 2.0 */
|
||||
/* call function for all accessible objects */
|
||||
traverseproc tp_traverse;
|
||||
|
||||
/* delete references to contained objects */
|
||||
inquiry tp_clear;
|
||||
|
||||
/* Assigned meaning in release 2.1 */
|
||||
/* rich comparisons */
|
||||
richcmpfunc tp_richcompare;
|
||||
|
||||
/* weak reference enabler */
|
||||
long tp_weaklistoffset;
|
||||
|
||||
/* Added in release 2.2 */
|
||||
/* Iterators */
|
||||
getiterfunc tp_iter;
|
||||
iternextfunc tp_iternext;
|
||||
|
||||
/* Attribute descriptor and subclassing stuff */
|
||||
struct PyMethodDef *tp_methods;
|
||||
struct PyMemberDef *tp_members;
|
||||
struct PyGetSetDef *tp_getset;
|
||||
struct _typeobject *tp_base;
|
||||
PyObject *tp_dict;
|
||||
descrgetfunc tp_descr_get;
|
||||
descrsetfunc tp_descr_set;
|
||||
long tp_dictoffset;
|
||||
initproc tp_init;
|
||||
allocfunc tp_alloc;
|
||||
newfunc tp_new;
|
||||
freefunc tp_free; /* Low-level free-memory routine */
|
||||
inquiry tp_is_gc; /* For PyObject_IS_GC */
|
||||
PyObject *tp_bases;
|
||||
PyObject *tp_mro; /* method resolution order */
|
||||
PyObject *tp_cache;
|
||||
PyObject *tp_subclasses;
|
||||
PyObject *tp_weaklist;
|
||||
|
||||
} PyTypeObject;
|
||||
139
Doc-26/includes/tzinfo-examples.py
Normal file
139
Doc-26/includes/tzinfo-examples.py
Normal file
@@ -0,0 +1,139 @@
|
||||
from datetime import tzinfo, timedelta, datetime
|
||||
|
||||
ZERO = timedelta(0)
|
||||
HOUR = timedelta(hours=1)
|
||||
|
||||
# A UTC class.
|
||||
|
||||
class UTC(tzinfo):
|
||||
"""UTC"""
|
||||
|
||||
def utcoffset(self, dt):
|
||||
return ZERO
|
||||
|
||||
def tzname(self, dt):
|
||||
return "UTC"
|
||||
|
||||
def dst(self, dt):
|
||||
return ZERO
|
||||
|
||||
utc = UTC()
|
||||
|
||||
# A class building tzinfo objects for fixed-offset time zones.
|
||||
# Note that FixedOffset(0, "UTC") is a different way to build a
|
||||
# UTC tzinfo object.
|
||||
|
||||
class FixedOffset(tzinfo):
|
||||
"""Fixed offset in minutes east from UTC."""
|
||||
|
||||
def __init__(self, offset, name):
|
||||
self.__offset = timedelta(minutes = offset)
|
||||
self.__name = name
|
||||
|
||||
def utcoffset(self, dt):
|
||||
return self.__offset
|
||||
|
||||
def tzname(self, dt):
|
||||
return self.__name
|
||||
|
||||
def dst(self, dt):
|
||||
return ZERO
|
||||
|
||||
# A class capturing the platform's idea of local time.
|
||||
|
||||
import time as _time
|
||||
|
||||
STDOFFSET = timedelta(seconds = -_time.timezone)
|
||||
if _time.daylight:
|
||||
DSTOFFSET = timedelta(seconds = -_time.altzone)
|
||||
else:
|
||||
DSTOFFSET = STDOFFSET
|
||||
|
||||
DSTDIFF = DSTOFFSET - STDOFFSET
|
||||
|
||||
class LocalTimezone(tzinfo):
|
||||
|
||||
def utcoffset(self, dt):
|
||||
if self._isdst(dt):
|
||||
return DSTOFFSET
|
||||
else:
|
||||
return STDOFFSET
|
||||
|
||||
def dst(self, dt):
|
||||
if self._isdst(dt):
|
||||
return DSTDIFF
|
||||
else:
|
||||
return ZERO
|
||||
|
||||
def tzname(self, dt):
|
||||
return _time.tzname[self._isdst(dt)]
|
||||
|
||||
def _isdst(self, dt):
|
||||
tt = (dt.year, dt.month, dt.day,
|
||||
dt.hour, dt.minute, dt.second,
|
||||
dt.weekday(), 0, -1)
|
||||
stamp = _time.mktime(tt)
|
||||
tt = _time.localtime(stamp)
|
||||
return tt.tm_isdst > 0
|
||||
|
||||
Local = LocalTimezone()
|
||||
|
||||
|
||||
# A complete implementation of current DST rules for major US time zones.
|
||||
|
||||
def first_sunday_on_or_after(dt):
|
||||
days_to_go = 6 - dt.weekday()
|
||||
if days_to_go:
|
||||
dt += timedelta(days_to_go)
|
||||
return dt
|
||||
|
||||
# In the US, DST starts at 2am (standard time) on the first Sunday in April.
|
||||
DSTSTART = datetime(1, 4, 1, 2)
|
||||
# and ends at 2am (DST time; 1am standard time) on the last Sunday of Oct.
|
||||
# which is the first Sunday on or after Oct 25.
|
||||
DSTEND = datetime(1, 10, 25, 1)
|
||||
|
||||
class USTimeZone(tzinfo):
|
||||
|
||||
def __init__(self, hours, reprname, stdname, dstname):
|
||||
self.stdoffset = timedelta(hours=hours)
|
||||
self.reprname = reprname
|
||||
self.stdname = stdname
|
||||
self.dstname = dstname
|
||||
|
||||
def __repr__(self):
|
||||
return self.reprname
|
||||
|
||||
def tzname(self, dt):
|
||||
if self.dst(dt):
|
||||
return self.dstname
|
||||
else:
|
||||
return self.stdname
|
||||
|
||||
def utcoffset(self, dt):
|
||||
return self.stdoffset + self.dst(dt)
|
||||
|
||||
def dst(self, dt):
|
||||
if dt is None or dt.tzinfo is None:
|
||||
# An exception may be sensible here, in one or both cases.
|
||||
# It depends on how you want to treat them. The default
|
||||
# fromutc() implementation (called by the default astimezone()
|
||||
# implementation) passes a datetime with dt.tzinfo is self.
|
||||
return ZERO
|
||||
assert dt.tzinfo is self
|
||||
|
||||
# Find first Sunday in April & the last in October.
|
||||
start = first_sunday_on_or_after(DSTSTART.replace(year=dt.year))
|
||||
end = first_sunday_on_or_after(DSTEND.replace(year=dt.year))
|
||||
|
||||
# Can't compare naive to aware objects, so strip the timezone from
|
||||
# dt first.
|
||||
if start <= dt.replace(tzinfo=None) < end:
|
||||
return HOUR
|
||||
else:
|
||||
return ZERO
|
||||
|
||||
Eastern = USTimeZone(-5, "Eastern", "EST", "EDT")
|
||||
Central = USTimeZone(-6, "Central", "CST", "CDT")
|
||||
Mountain = USTimeZone(-7, "Mountain", "MST", "MDT")
|
||||
Pacific = USTimeZone(-8, "Pacific", "PST", "PDT")
|
||||
1030
Doc-26/install/index.rst
Normal file
1030
Doc-26/install/index.rst
Normal file
File diff suppressed because it is too large
Load Diff
41
Doc-26/library/__builtin__.rst
Normal file
41
Doc-26/library/__builtin__.rst
Normal file
@@ -0,0 +1,41 @@
|
||||
|
||||
:mod:`__builtin__` --- Built-in objects
|
||||
=======================================
|
||||
|
||||
.. module:: __builtin__
|
||||
:synopsis: The module that provides the built-in namespace.
|
||||
|
||||
|
||||
This module provides direct access to all 'built-in' identifiers of Python; for
|
||||
example, ``__builtin__.open`` is the full name for the built-in function
|
||||
:func:`open`. See chapter :ref:`builtin`, "Built-in Objects."
|
||||
|
||||
This module is not normally accessed explicitly by most applications, but can be
|
||||
useful in modules that provide objects with the same name as a built-in value,
|
||||
but in which the built-in of that name is also needed. For example, in a module
|
||||
that wants to implement an :func:`open` function that wraps the built-in
|
||||
:func:`open`, this module can be used directly::
|
||||
|
||||
import __builtin__
|
||||
|
||||
def open(path):
|
||||
f = __builtin__.open(path, 'r')
|
||||
return UpperCaser(f)
|
||||
|
||||
class UpperCaser:
|
||||
'''Wrapper around a file that converts output to upper-case.'''
|
||||
|
||||
def __init__(self, f):
|
||||
self._f = f
|
||||
|
||||
def read(self, count=-1):
|
||||
return self._f.read(count).upper()
|
||||
|
||||
# ...
|
||||
|
||||
As an implementation detail, most modules have the name ``__builtins__`` (note
|
||||
the ``'s'``) made available as part of their globals. The value of
|
||||
``__builtins__`` is normally either this module or the value of this modules's
|
||||
:attr:`__dict__` attribute. Since this is an implementation detail, it may not
|
||||
be used by alternate implementations of Python.
|
||||
|
||||
61
Doc-26/library/__future__.rst
Normal file
61
Doc-26/library/__future__.rst
Normal file
@@ -0,0 +1,61 @@
|
||||
|
||||
:mod:`__future__` --- Future statement definitions
|
||||
==================================================
|
||||
|
||||
.. module:: __future__
|
||||
:synopsis: Future statement definitions
|
||||
|
||||
|
||||
:mod:`__future__` is a real module, and serves three purposes:
|
||||
|
||||
* To avoid confusing existing tools that analyze import statements and expect to
|
||||
find the modules they're importing.
|
||||
|
||||
* To ensure that future_statements run under releases prior to 2.1 at least
|
||||
yield runtime exceptions (the import of :mod:`__future__` will fail, because
|
||||
there was no module of that name prior to 2.1).
|
||||
|
||||
* To document when incompatible changes were introduced, and when they will be
|
||||
--- or were --- made mandatory. This is a form of executable documentation, and
|
||||
can be inspected programatically via importing :mod:`__future__` and examining
|
||||
its contents.
|
||||
|
||||
Each statement in :file:`__future__.py` is of the form::
|
||||
|
||||
FeatureName = "_Feature(" OptionalRelease "," MandatoryRelease ","
|
||||
CompilerFlag ")"
|
||||
|
||||
|
||||
where, normally, *OptionalRelease* is less than *MandatoryRelease*, and both are
|
||||
5-tuples of the same form as ``sys.version_info``::
|
||||
|
||||
(PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int
|
||||
PY_MINOR_VERSION, # the 1; an int
|
||||
PY_MICRO_VERSION, # the 0; an int
|
||||
PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string
|
||||
PY_RELEASE_SERIAL # the 3; an int
|
||||
)
|
||||
|
||||
*OptionalRelease* records the first release in which the feature was accepted.
|
||||
|
||||
In the case of a *MandatoryRelease* that has not yet occurred,
|
||||
*MandatoryRelease* predicts the release in which the feature will become part of
|
||||
the language.
|
||||
|
||||
Else *MandatoryRelease* records when the feature became part of the language; in
|
||||
releases at or after that, modules no longer need a future statement to use the
|
||||
feature in question, but may continue to use such imports.
|
||||
|
||||
*MandatoryRelease* may also be ``None``, meaning that a planned feature got
|
||||
dropped.
|
||||
|
||||
Instances of class :class:`_Feature` have two corresponding methods,
|
||||
:meth:`getOptionalRelease` and :meth:`getMandatoryRelease`.
|
||||
|
||||
*CompilerFlag* is the (bitfield) flag that should be passed in the fourth
|
||||
argument to the builtin function :func:`compile` to enable the feature in
|
||||
dynamically compiled code. This flag is stored in the :attr:`compiler_flag`
|
||||
attribute on :class:`_Feature` instances.
|
||||
|
||||
No feature description will ever be deleted from :mod:`__future__`.
|
||||
|
||||
17
Doc-26/library/__main__.rst
Normal file
17
Doc-26/library/__main__.rst
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
:mod:`__main__` --- Top-level script environment
|
||||
================================================
|
||||
|
||||
.. module:: __main__
|
||||
:synopsis: The environment where the top-level script is run.
|
||||
|
||||
|
||||
This module represents the (otherwise anonymous) scope in which the
|
||||
interpreter's main program executes --- commands read either from standard
|
||||
input, from a script file, or from an interactive prompt. It is this
|
||||
environment in which the idiomatic "conditional script" stanza causes a script
|
||||
to run::
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
420
Doc-26/library/_winreg.rst
Normal file
420
Doc-26/library/_winreg.rst
Normal file
@@ -0,0 +1,420 @@
|
||||
|
||||
:mod:`_winreg` -- Windows registry access
|
||||
=========================================
|
||||
|
||||
.. module:: _winreg
|
||||
:platform: Windows
|
||||
:synopsis: Routines and objects for manipulating the Windows registry.
|
||||
.. sectionauthor:: Mark Hammond <MarkH@ActiveState.com>
|
||||
|
||||
|
||||
.. versionadded:: 2.0
|
||||
|
||||
These functions expose the Windows registry API to Python. Instead of using an
|
||||
integer as the registry handle, a handle object is used to ensure that the
|
||||
handles are closed correctly, even if the programmer neglects to explicitly
|
||||
close them.
|
||||
|
||||
This module exposes a very low-level interface to the Windows registry; it is
|
||||
expected that in the future a new ``winreg`` module will be created offering a
|
||||
higher-level interface to the registry API.
|
||||
|
||||
This module offers the following functions:
|
||||
|
||||
|
||||
.. function:: CloseKey(hkey)
|
||||
|
||||
Closes a previously opened registry key. The hkey argument specifies a
|
||||
previously opened key.
|
||||
|
||||
Note that if *hkey* is not closed using this method (or via
|
||||
:meth:`handle.Close`), it is closed when the *hkey* object is destroyed by
|
||||
Python.
|
||||
|
||||
|
||||
.. function:: ConnectRegistry(computer_name, key)
|
||||
|
||||
Establishes a connection to a predefined registry handle on another computer,
|
||||
and returns a :dfn:`handle object`
|
||||
|
||||
*computer_name* is the name of the remote computer, of the form
|
||||
``r"\\computername"``. If ``None``, the local computer is used.
|
||||
|
||||
*key* is the predefined handle to connect to.
|
||||
|
||||
The return value is the handle of the opened key. If the function fails, an
|
||||
:exc:`EnvironmentError` exception is raised.
|
||||
|
||||
|
||||
.. function:: CreateKey(key, sub_key)
|
||||
|
||||
Creates or opens the specified key, returning a :dfn:`handle object`
|
||||
|
||||
*key* is an already open key, or one of the predefined :const:`HKEY_\*`
|
||||
constants.
|
||||
|
||||
*sub_key* is a string that names the key this method opens or creates.
|
||||
|
||||
If *key* is one of the predefined keys, *sub_key* may be ``None``. In that
|
||||
case, the handle returned is the same key handle passed in to the function.
|
||||
|
||||
If the key already exists, this function opens the existing key.
|
||||
|
||||
The return value is the handle of the opened key. If the function fails, an
|
||||
:exc:`EnvironmentError` exception is raised.
|
||||
|
||||
|
||||
.. function:: DeleteKey(key, sub_key)
|
||||
|
||||
Deletes the specified key.
|
||||
|
||||
*key* is an already open key, or any one of the predefined :const:`HKEY_\*`
|
||||
constants.
|
||||
|
||||
*sub_key* is a string that must be a subkey of the key identified by the *key*
|
||||
parameter. This value must not be ``None``, and the key may not have subkeys.
|
||||
|
||||
*This method can not delete keys with subkeys.*
|
||||
|
||||
If the method succeeds, the entire key, including all of its values, is removed.
|
||||
If the method fails, an :exc:`EnvironmentError` exception is raised.
|
||||
|
||||
|
||||
.. function:: DeleteValue(key, value)
|
||||
|
||||
Removes a named value from a registry key.
|
||||
|
||||
*key* is an already open key, or one of the predefined :const:`HKEY_\*`
|
||||
constants.
|
||||
|
||||
*value* is a string that identifies the value to remove.
|
||||
|
||||
|
||||
.. function:: EnumKey(key, index)
|
||||
|
||||
Enumerates subkeys of an open registry key, returning a string.
|
||||
|
||||
*key* is an already open key, or any one of the predefined :const:`HKEY_\*`
|
||||
constants.
|
||||
|
||||
*index* is an integer that identifies the index of the key to retrieve.
|
||||
|
||||
The function retrieves the name of one subkey each time it is called. It is
|
||||
typically called repeatedly until an :exc:`EnvironmentError` exception is
|
||||
raised, indicating, no more values are available.
|
||||
|
||||
|
||||
.. function:: EnumValue(key, index)
|
||||
|
||||
Enumerates values of an open registry key, returning a tuple.
|
||||
|
||||
*key* is an already open key, or any one of the predefined :const:`HKEY_\*`
|
||||
constants.
|
||||
|
||||
*index* is an integer that identifies the index of the value to retrieve.
|
||||
|
||||
The function retrieves the name of one subkey each time it is called. It is
|
||||
typically called repeatedly, until an :exc:`EnvironmentError` exception is
|
||||
raised, indicating no more values.
|
||||
|
||||
The result is a tuple of 3 items:
|
||||
|
||||
+-------+--------------------------------------------+
|
||||
| Index | Meaning |
|
||||
+=======+============================================+
|
||||
| ``0`` | A string that identifies the value name |
|
||||
+-------+--------------------------------------------+
|
||||
| ``1`` | An object that holds the value data, and |
|
||||
| | whose type depends on the underlying |
|
||||
| | registry type |
|
||||
+-------+--------------------------------------------+
|
||||
| ``2`` | An integer that identifies the type of the |
|
||||
| | value data |
|
||||
+-------+--------------------------------------------+
|
||||
|
||||
|
||||
.. function:: FlushKey(key)
|
||||
|
||||
Writes all the attributes of a key to the registry.
|
||||
|
||||
*key* is an already open key, or one of the predefined :const:`HKEY_\*`
|
||||
constants.
|
||||
|
||||
It is not necessary to call RegFlushKey to change a key. Registry changes are
|
||||
flushed to disk by the registry using its lazy flusher. Registry changes are
|
||||
also flushed to disk at system shutdown. Unlike :func:`CloseKey`, the
|
||||
:func:`FlushKey` method returns only when all the data has been written to the
|
||||
registry. An application should only call :func:`FlushKey` if it requires
|
||||
absolute certainty that registry changes are on disk.
|
||||
|
||||
.. note::
|
||||
|
||||
If you don't know whether a :func:`FlushKey` call is required, it probably
|
||||
isn't.
|
||||
|
||||
|
||||
.. function:: RegLoadKey(key, sub_key, file_name)
|
||||
|
||||
Creates a subkey under the specified key and stores registration information
|
||||
from a specified file into that subkey.
|
||||
|
||||
*key* is an already open key, or any of the predefined :const:`HKEY_\*`
|
||||
constants.
|
||||
|
||||
*sub_key* is a string that identifies the sub_key to load.
|
||||
|
||||
*file_name* is the name of the file to load registry data from. This file must
|
||||
have been created with the :func:`SaveKey` function. Under the file allocation
|
||||
table (FAT) file system, the filename may not have an extension.
|
||||
|
||||
A call to LoadKey() fails if the calling process does not have the
|
||||
:const:`SE_RESTORE_PRIVILEGE` privilege. Note that privileges are different than
|
||||
permissions - see the Win32 documentation for more details.
|
||||
|
||||
If *key* is a handle returned by :func:`ConnectRegistry`, then the path
|
||||
specified in *fileName* is relative to the remote computer.
|
||||
|
||||
The Win32 documentation implies *key* must be in the :const:`HKEY_USER` or
|
||||
:const:`HKEY_LOCAL_MACHINE` tree. This may or may not be true.
|
||||
|
||||
|
||||
.. function:: OpenKey(key, sub_key[, res\ ``= 0``][, sam\ ``= KEY_READ``])
|
||||
|
||||
Opens the specified key, returning a :dfn:`handle object`
|
||||
|
||||
*key* is an already open key, or any one of the predefined :const:`HKEY_\*`
|
||||
constants.
|
||||
|
||||
*sub_key* is a string that identifies the sub_key to open.
|
||||
|
||||
*res* is a reserved integer, and must be zero. The default is zero.
|
||||
|
||||
*sam* is an integer that specifies an access mask that describes the desired
|
||||
security access for the key. Default is :const:`KEY_READ`
|
||||
|
||||
The result is a new handle to the specified key.
|
||||
|
||||
If the function fails, :exc:`EnvironmentError` is raised.
|
||||
|
||||
|
||||
.. function:: OpenKeyEx()
|
||||
|
||||
The functionality of :func:`OpenKeyEx` is provided via :func:`OpenKey`, by the
|
||||
use of default arguments.
|
||||
|
||||
|
||||
.. function:: QueryInfoKey(key)
|
||||
|
||||
Returns information about a key, as a tuple.
|
||||
|
||||
*key* is an already open key, or one of the predefined :const:`HKEY_\*`
|
||||
constants.
|
||||
|
||||
The result is a tuple of 3 items:
|
||||
|
||||
+-------+---------------------------------------------+
|
||||
| Index | Meaning |
|
||||
+=======+=============================================+
|
||||
| ``0`` | An integer giving the number of sub keys |
|
||||
| | this key has. |
|
||||
+-------+---------------------------------------------+
|
||||
| ``1`` | An integer giving the number of values this |
|
||||
| | key has. |
|
||||
+-------+---------------------------------------------+
|
||||
| ``2`` | A long integer giving when the key was last |
|
||||
| | modified (if available) as 100's of |
|
||||
| | nanoseconds since Jan 1, 1600. |
|
||||
+-------+---------------------------------------------+
|
||||
|
||||
|
||||
.. function:: QueryValue(key, sub_key)
|
||||
|
||||
Retrieves the unnamed value for a key, as a string
|
||||
|
||||
*key* is an already open key, or one of the predefined :const:`HKEY_\*`
|
||||
constants.
|
||||
|
||||
*sub_key* is a string that holds the name of the subkey with which the value is
|
||||
associated. If this parameter is ``None`` or empty, the function retrieves the
|
||||
value set by the :func:`SetValue` method for the key identified by *key*.
|
||||
|
||||
Values in the registry have name, type, and data components. This method
|
||||
retrieves the data for a key's first value that has a NULL name. But the
|
||||
underlying API call doesn't return the type, Lame Lame Lame, DO NOT USE THIS!!!
|
||||
|
||||
|
||||
.. function:: QueryValueEx(key, value_name)
|
||||
|
||||
Retrieves the type and data for a specified value name associated with an open
|
||||
registry key.
|
||||
|
||||
*key* is an already open key, or one of the predefined :const:`HKEY_\*`
|
||||
constants.
|
||||
|
||||
*value_name* is a string indicating the value to query.
|
||||
|
||||
The result is a tuple of 2 items:
|
||||
|
||||
+-------+-----------------------------------------+
|
||||
| Index | Meaning |
|
||||
+=======+=========================================+
|
||||
| ``0`` | The value of the registry item. |
|
||||
+-------+-----------------------------------------+
|
||||
| ``1`` | An integer giving the registry type for |
|
||||
| | this value. |
|
||||
+-------+-----------------------------------------+
|
||||
|
||||
|
||||
.. function:: SaveKey(key, file_name)
|
||||
|
||||
Saves the specified key, and all its subkeys to the specified file.
|
||||
|
||||
*key* is an already open key, or one of the predefined :const:`HKEY_\*`
|
||||
constants.
|
||||
|
||||
*file_name* is the name of the file to save registry data to. This file cannot
|
||||
already exist. If this filename includes an extension, it cannot be used on file
|
||||
allocation table (FAT) file systems by the :meth:`LoadKey`, :meth:`ReplaceKey`
|
||||
or :meth:`RestoreKey` methods.
|
||||
|
||||
If *key* represents a key on a remote computer, the path described by
|
||||
*file_name* is relative to the remote computer. The caller of this method must
|
||||
possess the :const:`SeBackupPrivilege` security privilege. Note that
|
||||
privileges are different than permissions - see the Win32 documentation for
|
||||
more details.
|
||||
|
||||
This function passes NULL for *security_attributes* to the API.
|
||||
|
||||
|
||||
.. function:: SetValue(key, sub_key, type, value)
|
||||
|
||||
Associates a value with a specified key.
|
||||
|
||||
*key* is an already open key, or one of the predefined :const:`HKEY_\*`
|
||||
constants.
|
||||
|
||||
*sub_key* is a string that names the subkey with which the value is associated.
|
||||
|
||||
*type* is an integer that specifies the type of the data. Currently this must be
|
||||
:const:`REG_SZ`, meaning only strings are supported. Use the :func:`SetValueEx`
|
||||
function for support for other data types.
|
||||
|
||||
*value* is a string that specifies the new value.
|
||||
|
||||
If the key specified by the *sub_key* parameter does not exist, the SetValue
|
||||
function creates it.
|
||||
|
||||
Value lengths are limited by available memory. Long values (more than 2048
|
||||
bytes) should be stored as files with the filenames stored in the configuration
|
||||
registry. This helps the registry perform efficiently.
|
||||
|
||||
The key identified by the *key* parameter must have been opened with
|
||||
:const:`KEY_SET_VALUE` access.
|
||||
|
||||
|
||||
.. function:: SetValueEx(key, value_name, reserved, type, value)
|
||||
|
||||
Stores data in the value field of an open registry key.
|
||||
|
||||
*key* is an already open key, or one of the predefined :const:`HKEY_\*`
|
||||
constants.
|
||||
|
||||
*value_name* is a string that names the subkey with which the value is
|
||||
associated.
|
||||
|
||||
*type* is an integer that specifies the type of the data. This should be one
|
||||
of the following constants defined in this module:
|
||||
|
||||
+----------------------------------+---------------------------------------------+
|
||||
| Constant | Meaning |
|
||||
+==================================+=============================================+
|
||||
| :const:`REG_BINARY` | Binary data in any form. |
|
||||
+----------------------------------+---------------------------------------------+
|
||||
| :const:`REG_DWORD` | A 32-bit number. |
|
||||
+----------------------------------+---------------------------------------------+
|
||||
| :const:`REG_DWORD_LITTLE_ENDIAN` | A 32-bit number in little-endian format. |
|
||||
+----------------------------------+---------------------------------------------+
|
||||
| :const:`REG_DWORD_BIG_ENDIAN` | A 32-bit number in big-endian format. |
|
||||
+----------------------------------+---------------------------------------------+
|
||||
| :const:`REG_EXPAND_SZ` | Null-terminated string containing |
|
||||
| | references to environment variables |
|
||||
| | (``%PATH%``). |
|
||||
+----------------------------------+---------------------------------------------+
|
||||
| :const:`REG_LINK` | A Unicode symbolic link. |
|
||||
+----------------------------------+---------------------------------------------+
|
||||
| :const:`REG_MULTI_SZ` | A sequence of null-terminated strings, |
|
||||
| | terminated by two null characters. (Python |
|
||||
| | handles this termination automatically.) |
|
||||
+----------------------------------+---------------------------------------------+
|
||||
| :const:`REG_NONE` | No defined value type. |
|
||||
+----------------------------------+---------------------------------------------+
|
||||
| :const:`REG_RESOURCE_LIST` | A device-driver resource list. |
|
||||
+----------------------------------+---------------------------------------------+
|
||||
| :const:`REG_SZ` | A null-terminated string. |
|
||||
+----------------------------------+---------------------------------------------+
|
||||
|
||||
*reserved* can be anything - zero is always passed to the API.
|
||||
|
||||
*value* is a string that specifies the new value.
|
||||
|
||||
This method can also set additional value and type information for the specified
|
||||
key. The key identified by the key parameter must have been opened with
|
||||
:const:`KEY_SET_VALUE` access.
|
||||
|
||||
To open the key, use the :func:`CreateKeyEx` or :func:`OpenKey` methods.
|
||||
|
||||
Value lengths are limited by available memory. Long values (more than 2048
|
||||
bytes) should be stored as files with the filenames stored in the configuration
|
||||
registry. This helps the registry perform efficiently.
|
||||
|
||||
|
||||
.. _handle-object:
|
||||
|
||||
Registry Handle Objects
|
||||
-----------------------
|
||||
|
||||
This object wraps a Windows HKEY object, automatically closing it when the
|
||||
object is destroyed. To guarantee cleanup, you can call either the
|
||||
:meth:`Close` method on the object, or the :func:`CloseKey` function.
|
||||
|
||||
All registry functions in this module return one of these objects.
|
||||
|
||||
All registry functions in this module which accept a handle object also accept
|
||||
an integer, however, use of the handle object is encouraged.
|
||||
|
||||
Handle objects provide semantics for :meth:`__nonzero__` - thus ::
|
||||
|
||||
if handle:
|
||||
print "Yes"
|
||||
|
||||
will print ``Yes`` if the handle is currently valid (has not been closed or
|
||||
detached).
|
||||
|
||||
The object also support comparison semantics, so handle objects will compare
|
||||
true if they both reference the same underlying Windows handle value.
|
||||
|
||||
Handle objects can be converted to an integer (e.g., using the builtin
|
||||
:func:`int` function), in which case the underlying Windows handle value is
|
||||
returned. You can also use the :meth:`Detach` method to return the integer
|
||||
handle, and also disconnect the Windows handle from the handle object.
|
||||
|
||||
|
||||
.. method:: PyHKEY.Close()
|
||||
|
||||
Closes the underlying Windows handle.
|
||||
|
||||
If the handle is already closed, no error is raised.
|
||||
|
||||
|
||||
.. method:: PyHKEY.Detach()
|
||||
|
||||
Detaches the Windows handle from the handle object.
|
||||
|
||||
The result is an integer (or long on 64 bit Windows) that holds the value of the
|
||||
handle before it is detached. If the handle is already detached or closed, this
|
||||
will return zero.
|
||||
|
||||
After calling this function, the handle is effectively invalidated, but the
|
||||
handle is not closed. You would call this function when you need the
|
||||
underlying Win32 handle to exist beyond the lifetime of the handle object.
|
||||
|
||||
225
Doc-26/library/aifc.rst
Normal file
225
Doc-26/library/aifc.rst
Normal file
@@ -0,0 +1,225 @@
|
||||
|
||||
:mod:`aifc` --- Read and write AIFF and AIFC files
|
||||
==================================================
|
||||
|
||||
.. module:: aifc
|
||||
:synopsis: Read and write audio files in AIFF or AIFC format.
|
||||
|
||||
|
||||
.. index::
|
||||
single: Audio Interchange File Format
|
||||
single: AIFF
|
||||
single: AIFF-C
|
||||
|
||||
This module provides support for reading and writing AIFF and AIFF-C files.
|
||||
AIFF is Audio Interchange File Format, a format for storing digital audio
|
||||
samples in a file. AIFF-C is a newer version of the format that includes the
|
||||
ability to compress the audio data.
|
||||
|
||||
**Caveat:** Some operations may only work under IRIX; these will raise
|
||||
:exc:`ImportError` when attempting to import the :mod:`cl` module, which is only
|
||||
available on IRIX.
|
||||
|
||||
Audio files have a number of parameters that describe the audio data. The
|
||||
sampling rate or frame rate is the number of times per second the sound is
|
||||
sampled. The number of channels indicate if the audio is mono, stereo, or
|
||||
quadro. Each frame consists of one sample per channel. The sample size is the
|
||||
size in bytes of each sample. Thus a frame consists of
|
||||
*nchannels*\**samplesize* bytes, and a second's worth of audio consists of
|
||||
*nchannels*\**samplesize*\**framerate* bytes.
|
||||
|
||||
For example, CD quality audio has a sample size of two bytes (16 bits), uses two
|
||||
channels (stereo) and has a frame rate of 44,100 frames/second. This gives a
|
||||
frame size of 4 bytes (2\*2), and a second's worth occupies 2\*2\*44100 bytes
|
||||
(176,400 bytes).
|
||||
|
||||
Module :mod:`aifc` defines the following function:
|
||||
|
||||
|
||||
.. function:: open(file[, mode])
|
||||
|
||||
Open an AIFF or AIFF-C file and return an object instance with methods that are
|
||||
described below. The argument *file* is either a string naming a file or a file
|
||||
object. *mode* must be ``'r'`` or ``'rb'`` when the file must be opened for
|
||||
reading, or ``'w'`` or ``'wb'`` when the file must be opened for writing. If
|
||||
omitted, ``file.mode`` is used if it exists, otherwise ``'rb'`` is used. When
|
||||
used for writing, the file object should be seekable, unless you know ahead of
|
||||
time how many samples you are going to write in total and use
|
||||
:meth:`writeframesraw` and :meth:`setnframes`.
|
||||
|
||||
Objects returned by :func:`open` when a file is opened for reading have the
|
||||
following methods:
|
||||
|
||||
|
||||
.. method:: aifc.getnchannels()
|
||||
|
||||
Return the number of audio channels (1 for mono, 2 for stereo).
|
||||
|
||||
|
||||
.. method:: aifc.getsampwidth()
|
||||
|
||||
Return the size in bytes of individual samples.
|
||||
|
||||
|
||||
.. method:: aifc.getframerate()
|
||||
|
||||
Return the sampling rate (number of audio frames per second).
|
||||
|
||||
|
||||
.. method:: aifc.getnframes()
|
||||
|
||||
Return the number of audio frames in the file.
|
||||
|
||||
|
||||
.. method:: aifc.getcomptype()
|
||||
|
||||
Return a four-character string describing the type of compression used in the
|
||||
audio file. For AIFF files, the returned value is ``'NONE'``.
|
||||
|
||||
|
||||
.. method:: aifc.getcompname()
|
||||
|
||||
Return a human-readable description of the type of compression used in the audio
|
||||
file. For AIFF files, the returned value is ``'not compressed'``.
|
||||
|
||||
|
||||
.. method:: aifc.getparams()
|
||||
|
||||
Return a tuple consisting of all of the above values in the above order.
|
||||
|
||||
|
||||
.. method:: aifc.getmarkers()
|
||||
|
||||
Return a list of markers in the audio file. A marker consists of a tuple of
|
||||
three elements. The first is the mark ID (an integer), the second is the mark
|
||||
position in frames from the beginning of the data (an integer), the third is the
|
||||
name of the mark (a string).
|
||||
|
||||
|
||||
.. method:: aifc.getmark(id)
|
||||
|
||||
Return the tuple as described in :meth:`getmarkers` for the mark with the given
|
||||
*id*.
|
||||
|
||||
|
||||
.. method:: aifc.readframes(nframes)
|
||||
|
||||
Read and return the next *nframes* frames from the audio file. The returned
|
||||
data is a string containing for each frame the uncompressed samples of all
|
||||
channels.
|
||||
|
||||
|
||||
.. method:: aifc.rewind()
|
||||
|
||||
Rewind the read pointer. The next :meth:`readframes` will start from the
|
||||
beginning.
|
||||
|
||||
|
||||
.. method:: aifc.setpos(pos)
|
||||
|
||||
Seek to the specified frame number.
|
||||
|
||||
|
||||
.. method:: aifc.tell()
|
||||
|
||||
Return the current frame number.
|
||||
|
||||
|
||||
.. method:: aifc.close()
|
||||
|
||||
Close the AIFF file. After calling this method, the object can no longer be
|
||||
used.
|
||||
|
||||
Objects returned by :func:`open` when a file is opened for writing have all the
|
||||
above methods, except for :meth:`readframes` and :meth:`setpos`. In addition
|
||||
the following methods exist. The :meth:`get\*` methods can only be called after
|
||||
the corresponding :meth:`set\*` methods have been called. Before the first
|
||||
:meth:`writeframes` or :meth:`writeframesraw`, all parameters except for the
|
||||
number of frames must be filled in.
|
||||
|
||||
|
||||
.. method:: aifc.aiff()
|
||||
|
||||
Create an AIFF file. The default is that an AIFF-C file is created, unless the
|
||||
name of the file ends in ``'.aiff'`` in which case the default is an AIFF file.
|
||||
|
||||
|
||||
.. method:: aifc.aifc()
|
||||
|
||||
Create an AIFF-C file. The default is that an AIFF-C file is created, unless
|
||||
the name of the file ends in ``'.aiff'`` in which case the default is an AIFF
|
||||
file.
|
||||
|
||||
|
||||
.. method:: aifc.setnchannels(nchannels)
|
||||
|
||||
Specify the number of channels in the audio file.
|
||||
|
||||
|
||||
.. method:: aifc.setsampwidth(width)
|
||||
|
||||
Specify the size in bytes of audio samples.
|
||||
|
||||
|
||||
.. method:: aifc.setframerate(rate)
|
||||
|
||||
Specify the sampling frequency in frames per second.
|
||||
|
||||
|
||||
.. method:: aifc.setnframes(nframes)
|
||||
|
||||
Specify the number of frames that are to be written to the audio file. If this
|
||||
parameter is not set, or not set correctly, the file needs to support seeking.
|
||||
|
||||
|
||||
.. method:: aifc.setcomptype(type, name)
|
||||
|
||||
.. index::
|
||||
single: u-LAW
|
||||
single: A-LAW
|
||||
single: G.722
|
||||
|
||||
Specify the compression type. If not specified, the audio data will not be
|
||||
compressed. In AIFF files, compression is not possible. The name parameter
|
||||
should be a human-readable description of the compression type, the type
|
||||
parameter should be a four-character string. Currently the following
|
||||
compression types are supported: NONE, ULAW, ALAW, G722.
|
||||
|
||||
|
||||
.. method:: aifc.setparams(nchannels, sampwidth, framerate, comptype, compname)
|
||||
|
||||
Set all the above parameters at once. The argument is a tuple consisting of the
|
||||
various parameters. This means that it is possible to use the result of a
|
||||
:meth:`getparams` call as argument to :meth:`setparams`.
|
||||
|
||||
|
||||
.. method:: aifc.setmark(id, pos, name)
|
||||
|
||||
Add a mark with the given id (larger than 0), and the given name at the given
|
||||
position. This method can be called at any time before :meth:`close`.
|
||||
|
||||
|
||||
.. method:: aifc.tell()
|
||||
|
||||
Return the current write position in the output file. Useful in combination
|
||||
with :meth:`setmark`.
|
||||
|
||||
|
||||
.. method:: aifc.writeframes(data)
|
||||
|
||||
Write data to the output file. This method can only be called after the audio
|
||||
file parameters have been set.
|
||||
|
||||
|
||||
.. method:: aifc.writeframesraw(data)
|
||||
|
||||
Like :meth:`writeframes`, except that the header of the audio file is not
|
||||
updated.
|
||||
|
||||
|
||||
.. method:: aifc.close()
|
||||
|
||||
Close the AIFF file. The header of the file is updated to reflect the actual
|
||||
size of the audio data. After calling this method, the object can no longer be
|
||||
used.
|
||||
|
||||
206
Doc-26/library/al.rst
Normal file
206
Doc-26/library/al.rst
Normal file
@@ -0,0 +1,206 @@
|
||||
|
||||
:mod:`al` --- Audio functions on the SGI
|
||||
========================================
|
||||
|
||||
.. module:: al
|
||||
:platform: IRIX
|
||||
:synopsis: Audio functions on the SGI.
|
||||
|
||||
|
||||
This module provides access to the audio facilities of the SGI Indy and Indigo
|
||||
workstations. See section 3A of the IRIX man pages for details. You'll need to
|
||||
read those man pages to understand what these functions do! Some of the
|
||||
functions are not available in IRIX releases before 4.0.5. Again, see the
|
||||
manual to check whether a specific function is available on your platform.
|
||||
|
||||
All functions and methods defined in this module are equivalent to the C
|
||||
functions with ``AL`` prefixed to their name.
|
||||
|
||||
.. index:: module: AL
|
||||
|
||||
Symbolic constants from the C header file ``<audio.h>`` are defined in the
|
||||
standard module :mod:`AL`, see below.
|
||||
|
||||
.. warning::
|
||||
|
||||
The current version of the audio library may dump core when bad argument values
|
||||
are passed rather than returning an error status. Unfortunately, since the
|
||||
precise circumstances under which this may happen are undocumented and hard to
|
||||
check, the Python interface can provide no protection against this kind of
|
||||
problems. (One example is specifying an excessive queue size --- there is no
|
||||
documented upper limit.)
|
||||
|
||||
The module defines the following functions:
|
||||
|
||||
|
||||
.. function:: openport(name, direction[, config])
|
||||
|
||||
The name and direction arguments are strings. The optional *config* argument is
|
||||
a configuration object as returned by :func:`newconfig`. The return value is an
|
||||
:dfn:`audio port object`; methods of audio port objects are described below.
|
||||
|
||||
|
||||
.. function:: newconfig()
|
||||
|
||||
The return value is a new :dfn:`audio configuration object`; methods of audio
|
||||
configuration objects are described below.
|
||||
|
||||
|
||||
.. function:: queryparams(device)
|
||||
|
||||
The device argument is an integer. The return value is a list of integers
|
||||
containing the data returned by :cfunc:`ALqueryparams`.
|
||||
|
||||
|
||||
.. function:: getparams(device, list)
|
||||
|
||||
The *device* argument is an integer. The list argument is a list such as
|
||||
returned by :func:`queryparams`; it is modified in place (!).
|
||||
|
||||
|
||||
.. function:: setparams(device, list)
|
||||
|
||||
The *device* argument is an integer. The *list* argument is a list such as
|
||||
returned by :func:`queryparams`.
|
||||
|
||||
|
||||
.. _al-config-objects:
|
||||
|
||||
Configuration Objects
|
||||
---------------------
|
||||
|
||||
Configuration objects returned by :func:`newconfig` have the following methods:
|
||||
|
||||
|
||||
.. method:: audio configuration.getqueuesize()
|
||||
|
||||
Return the queue size.
|
||||
|
||||
|
||||
.. method:: audio configuration.setqueuesize(size)
|
||||
|
||||
Set the queue size.
|
||||
|
||||
|
||||
.. method:: audio configuration.getwidth()
|
||||
|
||||
Get the sample width.
|
||||
|
||||
|
||||
.. method:: audio configuration.setwidth(width)
|
||||
|
||||
Set the sample width.
|
||||
|
||||
|
||||
.. method:: audio configuration.getchannels()
|
||||
|
||||
Get the channel count.
|
||||
|
||||
|
||||
.. method:: audio configuration.setchannels(nchannels)
|
||||
|
||||
Set the channel count.
|
||||
|
||||
|
||||
.. method:: audio configuration.getsampfmt()
|
||||
|
||||
Get the sample format.
|
||||
|
||||
|
||||
.. method:: audio configuration.setsampfmt(sampfmt)
|
||||
|
||||
Set the sample format.
|
||||
|
||||
|
||||
.. method:: audio configuration.getfloatmax()
|
||||
|
||||
Get the maximum value for floating sample formats.
|
||||
|
||||
|
||||
.. method:: audio configuration.setfloatmax(floatmax)
|
||||
|
||||
Set the maximum value for floating sample formats.
|
||||
|
||||
|
||||
.. _al-port-objects:
|
||||
|
||||
Port Objects
|
||||
------------
|
||||
|
||||
Port objects, as returned by :func:`openport`, have the following methods:
|
||||
|
||||
|
||||
.. method:: audio port.closeport()
|
||||
|
||||
Close the port.
|
||||
|
||||
|
||||
.. method:: audio port.getfd()
|
||||
|
||||
Return the file descriptor as an int.
|
||||
|
||||
|
||||
.. method:: audio port.getfilled()
|
||||
|
||||
Return the number of filled samples.
|
||||
|
||||
|
||||
.. method:: audio port.getfillable()
|
||||
|
||||
Return the number of fillable samples.
|
||||
|
||||
|
||||
.. method:: audio port.readsamps(nsamples)
|
||||
|
||||
Read a number of samples from the queue, blocking if necessary. Return the data
|
||||
as a string containing the raw data, (e.g., 2 bytes per sample in big-endian
|
||||
byte order (high byte, low byte) if you have set the sample width to 2 bytes).
|
||||
|
||||
|
||||
.. method:: audio port.writesamps(samples)
|
||||
|
||||
Write samples into the queue, blocking if necessary. The samples are encoded as
|
||||
described for the :meth:`readsamps` return value.
|
||||
|
||||
|
||||
.. method:: audio port.getfillpoint()
|
||||
|
||||
Return the 'fill point'.
|
||||
|
||||
|
||||
.. method:: audio port.setfillpoint(fillpoint)
|
||||
|
||||
Set the 'fill point'.
|
||||
|
||||
|
||||
.. method:: audio port.getconfig()
|
||||
|
||||
Return a configuration object containing the current configuration of the port.
|
||||
|
||||
|
||||
.. method:: audio port.setconfig(config)
|
||||
|
||||
Set the configuration from the argument, a configuration object.
|
||||
|
||||
|
||||
.. method:: audio port.getstatus(list)
|
||||
|
||||
Get status information on last error.
|
||||
|
||||
|
||||
:mod:`AL` --- Constants used with the :mod:`al` module
|
||||
======================================================
|
||||
|
||||
.. module:: AL
|
||||
:platform: IRIX
|
||||
:synopsis: Constants used with the al module.
|
||||
|
||||
|
||||
This module defines symbolic constants needed to use the built-in module
|
||||
:mod:`al` (see above); they are equivalent to those defined in the C header file
|
||||
``<audio.h>`` except that the name prefix ``AL_`` is omitted. Read the module
|
||||
source for a complete list of the defined names. Suggested use::
|
||||
|
||||
import al
|
||||
from AL import *
|
||||
|
||||
27
Doc-26/library/allos.rst
Normal file
27
Doc-26/library/allos.rst
Normal file
@@ -0,0 +1,27 @@
|
||||
|
||||
.. _allos:
|
||||
|
||||
*********************************
|
||||
Generic Operating System Services
|
||||
*********************************
|
||||
|
||||
The modules described in this chapter provide interfaces to operating system
|
||||
features that are available on (almost) all operating systems, such as files and
|
||||
a clock. The interfaces are generally modeled after the Unix or C interfaces,
|
||||
but they are available on most other systems as well. Here's an overview:
|
||||
|
||||
|
||||
.. toctree::
|
||||
|
||||
os.rst
|
||||
time.rst
|
||||
optparse.rst
|
||||
getopt.rst
|
||||
logging.rst
|
||||
getpass.rst
|
||||
curses.rst
|
||||
curses.ascii.rst
|
||||
curses.panel.rst
|
||||
platform.rst
|
||||
errno.rst
|
||||
ctypes.rst
|
||||
96
Doc-26/library/anydbm.rst
Normal file
96
Doc-26/library/anydbm.rst
Normal file
@@ -0,0 +1,96 @@
|
||||
|
||||
:mod:`anydbm` --- Generic access to DBM-style databases
|
||||
=======================================================
|
||||
|
||||
.. module:: anydbm
|
||||
:synopsis: Generic interface to DBM-style database modules.
|
||||
|
||||
|
||||
.. index::
|
||||
module: dbhash
|
||||
module: bsddb
|
||||
module: gdbm
|
||||
module: dbm
|
||||
module: dumbdbm
|
||||
|
||||
:mod:`anydbm` is a generic interface to variants of the DBM database ---
|
||||
:mod:`dbhash` (requires :mod:`bsddb`), :mod:`gdbm`, or :mod:`dbm`. If none of
|
||||
these modules is installed, the slow-but-simple implementation in module
|
||||
:mod:`dumbdbm` will be used.
|
||||
|
||||
|
||||
.. function:: open(filename[, flag[, mode]])
|
||||
|
||||
Open the database file *filename* and return a corresponding object.
|
||||
|
||||
If the database file already exists, the :mod:`whichdb` module is used to
|
||||
determine its type and the appropriate module is used; if it does not exist, the
|
||||
first module listed above that can be imported is used.
|
||||
|
||||
The optional *flag* argument can be ``'r'`` to open an existing database for
|
||||
reading only, ``'w'`` to open an existing database for reading and writing,
|
||||
``'c'`` to create the database if it doesn't exist, or ``'n'``, which will
|
||||
always create a new empty database. If not specified, the default value is
|
||||
``'r'``.
|
||||
|
||||
The optional *mode* argument is the Unix mode of the file, used only when the
|
||||
database has to be created. It defaults to octal ``0666`` (and will be modified
|
||||
by the prevailing umask).
|
||||
|
||||
|
||||
.. exception:: error
|
||||
|
||||
A tuple containing the exceptions that can be raised by each of the supported
|
||||
modules, with a unique exception :exc:`anydbm.error` as the first item --- the
|
||||
latter is used when :exc:`anydbm.error` is raised.
|
||||
|
||||
The object returned by :func:`open` supports most of the same functionality as
|
||||
dictionaries; keys and their corresponding values can be stored, retrieved, and
|
||||
deleted, and the :meth:`has_key` and :meth:`keys` methods are available. Keys
|
||||
and values must always be strings.
|
||||
|
||||
The following example records some hostnames and a corresponding title, and
|
||||
then prints out the contents of the database::
|
||||
|
||||
import anydbm
|
||||
|
||||
# Open database, creating it if necessary.
|
||||
db = anydbm.open('cache', 'c')
|
||||
|
||||
# Record some values
|
||||
db['www.python.org'] = 'Python Website'
|
||||
db['www.cnn.com'] = 'Cable News Network'
|
||||
|
||||
# Loop through contents. Other dictionary methods
|
||||
# such as .keys(), .values() also work.
|
||||
for k, v in db.iteritems():
|
||||
print k, '\t', v
|
||||
|
||||
# Storing a non-string key or value will raise an exception (most
|
||||
# likely a TypeError).
|
||||
db['www.yahoo.com'] = 4
|
||||
|
||||
# Close when done.
|
||||
db.close()
|
||||
|
||||
|
||||
.. seealso::
|
||||
|
||||
Module :mod:`dbhash`
|
||||
BSD ``db`` database interface.
|
||||
|
||||
Module :mod:`dbm`
|
||||
Standard Unix database interface.
|
||||
|
||||
Module :mod:`dumbdbm`
|
||||
Portable implementation of the ``dbm`` interface.
|
||||
|
||||
Module :mod:`gdbm`
|
||||
GNU database interface, based on the ``dbm`` interface.
|
||||
|
||||
Module :mod:`shelve`
|
||||
General object persistence built on top of the Python ``dbm`` interface.
|
||||
|
||||
Module :mod:`whichdb`
|
||||
Utility module used to determine the type of an existing database.
|
||||
|
||||
18
Doc-26/library/archiving.rst
Normal file
18
Doc-26/library/archiving.rst
Normal file
@@ -0,0 +1,18 @@
|
||||
|
||||
.. _archiving:
|
||||
|
||||
******************************
|
||||
Data Compression and Archiving
|
||||
******************************
|
||||
|
||||
The modules described in this chapter support data compression with the zlib,
|
||||
gzip, and bzip2 algorithms, and the creation of ZIP- and tar-format archives.
|
||||
|
||||
|
||||
.. toctree::
|
||||
|
||||
zlib.rst
|
||||
gzip.rst
|
||||
bz2.rst
|
||||
zipfile.rst
|
||||
tarfile.rst
|
||||
273
Doc-26/library/array.rst
Normal file
273
Doc-26/library/array.rst
Normal file
@@ -0,0 +1,273 @@
|
||||
|
||||
:mod:`array` --- Efficient arrays of numeric values
|
||||
===================================================
|
||||
|
||||
.. module:: array
|
||||
:synopsis: Efficient arrays of uniformly typed numeric values.
|
||||
|
||||
|
||||
.. index:: single: arrays
|
||||
|
||||
This module defines an object type which can efficiently represent an array of
|
||||
basic values: characters, integers, floating point numbers. Arrays are sequence
|
||||
types and behave very much like lists, except that the type of objects stored in
|
||||
them is constrained. The type is specified at object creation time by using a
|
||||
:dfn:`type code`, which is a single character. The following type codes are
|
||||
defined:
|
||||
|
||||
+-----------+----------------+-------------------+-----------------------+
|
||||
| Type code | C Type | Python Type | Minimum size in bytes |
|
||||
+===========+================+===================+=======================+
|
||||
| ``'c'`` | char | character | 1 |
|
||||
+-----------+----------------+-------------------+-----------------------+
|
||||
| ``'b'`` | signed char | int | 1 |
|
||||
+-----------+----------------+-------------------+-----------------------+
|
||||
| ``'B'`` | unsigned char | int | 1 |
|
||||
+-----------+----------------+-------------------+-----------------------+
|
||||
| ``'u'`` | Py_UNICODE | Unicode character | 2 |
|
||||
+-----------+----------------+-------------------+-----------------------+
|
||||
| ``'h'`` | signed short | int | 2 |
|
||||
+-----------+----------------+-------------------+-----------------------+
|
||||
| ``'H'`` | unsigned short | int | 2 |
|
||||
+-----------+----------------+-------------------+-----------------------+
|
||||
| ``'i'`` | signed int | int | 2 |
|
||||
+-----------+----------------+-------------------+-----------------------+
|
||||
| ``'I'`` | unsigned int | long | 2 |
|
||||
+-----------+----------------+-------------------+-----------------------+
|
||||
| ``'l'`` | signed long | int | 4 |
|
||||
+-----------+----------------+-------------------+-----------------------+
|
||||
| ``'L'`` | unsigned long | long | 4 |
|
||||
+-----------+----------------+-------------------+-----------------------+
|
||||
| ``'f'`` | float | float | 4 |
|
||||
+-----------+----------------+-------------------+-----------------------+
|
||||
| ``'d'`` | double | float | 8 |
|
||||
+-----------+----------------+-------------------+-----------------------+
|
||||
|
||||
The actual representation of values is determined by the machine architecture
|
||||
(strictly speaking, by the C implementation). The actual size can be accessed
|
||||
through the :attr:`itemsize` attribute. The values stored for ``'L'`` and
|
||||
``'I'`` items will be represented as Python long integers when retrieved,
|
||||
because Python's plain integer type cannot represent the full range of C's
|
||||
unsigned (long) integers.
|
||||
|
||||
The module defines the following type:
|
||||
|
||||
|
||||
.. function:: array(typecode[, initializer])
|
||||
|
||||
Return a new array whose items are restricted by *typecode*, and initialized
|
||||
from the optional *initializer* value, which must be a list, string, or iterable
|
||||
over elements of the appropriate type.
|
||||
|
||||
.. versionchanged:: 2.4
|
||||
Formerly, only lists or strings were accepted.
|
||||
|
||||
If given a list or string, the initializer is passed to the new array's
|
||||
:meth:`fromlist`, :meth:`fromstring`, or :meth:`fromunicode` method (see below)
|
||||
to add initial items to the array. Otherwise, the iterable initializer is
|
||||
passed to the :meth:`extend` method.
|
||||
|
||||
|
||||
.. data:: ArrayType
|
||||
|
||||
Obsolete alias for :func:`array`.
|
||||
|
||||
Array objects support the ordinary sequence operations of indexing, slicing,
|
||||
concatenation, and multiplication. When using slice assignment, the assigned
|
||||
value must be an array object with the same type code; in all other cases,
|
||||
:exc:`TypeError` is raised. Array objects also implement the buffer interface,
|
||||
and may be used wherever buffer objects are supported.
|
||||
|
||||
The following data items and methods are also supported:
|
||||
|
||||
|
||||
.. attribute:: array.typecode
|
||||
|
||||
The typecode character used to create the array.
|
||||
|
||||
|
||||
.. attribute:: array.itemsize
|
||||
|
||||
The length in bytes of one array item in the internal representation.
|
||||
|
||||
|
||||
.. method:: array.append(x)
|
||||
|
||||
Append a new item with value *x* to the end of the array.
|
||||
|
||||
|
||||
.. method:: array.buffer_info()
|
||||
|
||||
Return a tuple ``(address, length)`` giving the current memory address and the
|
||||
length in elements of the buffer used to hold array's contents. The size of the
|
||||
memory buffer in bytes can be computed as ``array.buffer_info()[1] *
|
||||
array.itemsize``. This is occasionally useful when working with low-level (and
|
||||
inherently unsafe) I/O interfaces that require memory addresses, such as certain
|
||||
:cfunc:`ioctl` operations. The returned numbers are valid as long as the array
|
||||
exists and no length-changing operations are applied to it.
|
||||
|
||||
.. note::
|
||||
|
||||
When using array objects from code written in C or C++ (the only way to
|
||||
effectively make use of this information), it makes more sense to use the buffer
|
||||
interface supported by array objects. This method is maintained for backward
|
||||
compatibility and should be avoided in new code. The buffer interface is
|
||||
documented in the Python/C API Reference Manual (XXX reference:
|
||||
../api/newTypes.html).
|
||||
|
||||
|
||||
.. method:: array.byteswap()
|
||||
|
||||
"Byteswap" all items of the array. This is only supported for values which are
|
||||
1, 2, 4, or 8 bytes in size; for other types of values, :exc:`RuntimeError` is
|
||||
raised. It is useful when reading data from a file written on a machine with a
|
||||
different byte order.
|
||||
|
||||
|
||||
.. method:: array.count(x)
|
||||
|
||||
Return the number of occurrences of *x* in the array.
|
||||
|
||||
|
||||
.. method:: array.extend(iterable)
|
||||
|
||||
Append items from *iterable* to the end of the array. If *iterable* is another
|
||||
array, it must have *exactly* the same type code; if not, :exc:`TypeError` will
|
||||
be raised. If *iterable* is not an array, it must be iterable and its elements
|
||||
must be the right type to be appended to the array.
|
||||
|
||||
.. versionchanged:: 2.4
|
||||
Formerly, the argument could only be another array.
|
||||
|
||||
|
||||
.. method:: array.fromfile(f, n)
|
||||
|
||||
Read *n* items (as machine values) from the file object *f* and append them to
|
||||
the end of the array. If less than *n* items are available, :exc:`EOFError` is
|
||||
raised, but the items that were available are still inserted into the array.
|
||||
*f* must be a real built-in file object; something else with a :meth:`read`
|
||||
method won't do.
|
||||
|
||||
|
||||
.. method:: array.fromlist(list)
|
||||
|
||||
Append items from the list. This is equivalent to ``for x in list:
|
||||
a.append(x)`` except that if there is a type error, the array is unchanged.
|
||||
|
||||
|
||||
.. method:: array.fromstring(s)
|
||||
|
||||
Appends items from the string, interpreting the string as an array of machine
|
||||
values (as if it had been read from a file using the :meth:`fromfile` method).
|
||||
|
||||
|
||||
.. method:: array.fromunicode(s)
|
||||
|
||||
Extends this array with data from the given unicode string. The array must be a
|
||||
type ``'u'`` array; otherwise a :exc:`ValueError` is raised. Use
|
||||
``array.fromstring(ustr.decode(enc))`` to append Unicode data to an array of
|
||||
some other type.
|
||||
|
||||
|
||||
.. method:: array.index(x)
|
||||
|
||||
Return the smallest *i* such that *i* is the index of the first occurrence of
|
||||
*x* in the array.
|
||||
|
||||
|
||||
.. method:: array.insert(i, x)
|
||||
|
||||
Insert a new item with value *x* in the array before position *i*. Negative
|
||||
values are treated as being relative to the end of the array.
|
||||
|
||||
|
||||
.. method:: array.pop([i])
|
||||
|
||||
Removes the item with the index *i* from the array and returns it. The optional
|
||||
argument defaults to ``-1``, so that by default the last item is removed and
|
||||
returned.
|
||||
|
||||
|
||||
.. method:: array.read(f, n)
|
||||
|
||||
.. deprecated:: 1.5.1
|
||||
Use the :meth:`fromfile` method.
|
||||
|
||||
Read *n* items (as machine values) from the file object *f* and append them to
|
||||
the end of the array. If less than *n* items are available, :exc:`EOFError` is
|
||||
raised, but the items that were available are still inserted into the array.
|
||||
*f* must be a real built-in file object; something else with a :meth:`read`
|
||||
method won't do.
|
||||
|
||||
|
||||
.. method:: array.remove(x)
|
||||
|
||||
Remove the first occurrence of *x* from the array.
|
||||
|
||||
|
||||
.. method:: array.reverse()
|
||||
|
||||
Reverse the order of the items in the array.
|
||||
|
||||
|
||||
.. method:: array.tofile(f)
|
||||
|
||||
Write all items (as machine values) to the file object *f*.
|
||||
|
||||
|
||||
.. method:: array.tolist()
|
||||
|
||||
Convert the array to an ordinary list with the same items.
|
||||
|
||||
|
||||
.. method:: array.tostring()
|
||||
|
||||
Convert the array to an array of machine values and return the string
|
||||
representation (the same sequence of bytes that would be written to a file by
|
||||
the :meth:`tofile` method.)
|
||||
|
||||
|
||||
.. method:: array.tounicode()
|
||||
|
||||
Convert the array to a unicode string. The array must be a type ``'u'`` array;
|
||||
otherwise a :exc:`ValueError` is raised. Use ``array.tostring().decode(enc)`` to
|
||||
obtain a unicode string from an array of some other type.
|
||||
|
||||
|
||||
.. method:: array.write(f)
|
||||
|
||||
.. deprecated:: 1.5.1
|
||||
Use the :meth:`tofile` method.
|
||||
|
||||
Write all items (as machine values) to the file object *f*.
|
||||
|
||||
When an array object is printed or converted to a string, it is represented as
|
||||
``array(typecode, initializer)``. The *initializer* is omitted if the array is
|
||||
empty, otherwise it is a string if the *typecode* is ``'c'``, otherwise it is a
|
||||
list of numbers. The string is guaranteed to be able to be converted back to an
|
||||
array with the same type and value using reverse quotes (``````), so long as the
|
||||
:func:`array` function has been imported using ``from array import array``.
|
||||
Examples::
|
||||
|
||||
array('l')
|
||||
array('c', 'hello world')
|
||||
array('u', u'hello \textbackslash u2641')
|
||||
array('l', [1, 2, 3, 4, 5])
|
||||
array('d', [1.0, 2.0, 3.14])
|
||||
|
||||
|
||||
.. seealso::
|
||||
|
||||
Module :mod:`struct`
|
||||
Packing and unpacking of heterogeneous binary data.
|
||||
|
||||
Module :mod:`xdrlib`
|
||||
Packing and unpacking of External Data Representation (XDR) data as used in some
|
||||
remote procedure call systems.
|
||||
|
||||
`The Numerical Python Manual <http://numpy.sourceforge.net/numdoc/HTML/numdoc.htm>`_
|
||||
The Numeric Python extension (NumPy) defines another array type; see
|
||||
http://numpy.sourceforge.net/ for further information about Numerical Python.
|
||||
(A PDF version of the NumPy manual is available at
|
||||
http://numpy.sourceforge.net/numdoc/numdoc.pdf).
|
||||
|
||||
62
Doc-26/library/ast.rst
Normal file
62
Doc-26/library/ast.rst
Normal file
@@ -0,0 +1,62 @@
|
||||
.. % XXX Label can't be _ast?
|
||||
.. % XXX Where should this section/chapter go?
|
||||
|
||||
|
||||
.. _ast:
|
||||
|
||||
*********************
|
||||
Abstract Syntax Trees
|
||||
*********************
|
||||
|
||||
.. sectionauthor:: Martin v. Löwis <martin@v.loewis.de>
|
||||
|
||||
|
||||
.. versionadded:: 2.5
|
||||
|
||||
The ``_ast`` module helps Python applications to process trees of the Python
|
||||
abstract syntax grammar. The Python compiler currently provides read-only access
|
||||
to such trees, meaning that applications can only create a tree for a given
|
||||
piece of Python source code; generating byte code from a (potentially modified)
|
||||
tree is not supported. The abstract syntax itself might change with each Python
|
||||
release; this module helps to find out programmatically what the current grammar
|
||||
looks like.
|
||||
|
||||
An abstract syntax tree can be generated by passing ``_ast.PyCF_ONLY_AST`` as a
|
||||
flag to the :func:`compile` builtin function. The result will be a tree of
|
||||
objects whose classes all inherit from ``_ast.AST``.
|
||||
|
||||
The actual classes are derived from the ``Parser/Python.asdl`` file, which is
|
||||
reproduced below. There is one class defined for each left-hand side symbol in
|
||||
the abstract grammar (for example, ``_ast.stmt`` or ``_ast.expr``). In addition,
|
||||
there is one class defined for each constructor on the right-hand side; these
|
||||
classes inherit from the classes for the left-hand side trees. For example,
|
||||
``_ast.BinOp`` inherits from ``_ast.expr``. For production rules with
|
||||
alternatives (aka "sums"), the left-hand side class is abstract: only instances
|
||||
of specific constructor nodes are ever created.
|
||||
|
||||
Each concrete class has an attribute ``_fields`` which gives the names of all
|
||||
child nodes.
|
||||
|
||||
Each instance of a concrete class has one attribute for each child node, of the
|
||||
type as defined in the grammar. For example, ``_ast.BinOp`` instances have an
|
||||
attribute ``left`` of type ``_ast.expr``. Instances of ``_ast.expr`` and
|
||||
``_ast.stmt`` subclasses also have lineno and col_offset attributes. The lineno
|
||||
is the line number of source text (1 indexed so the first line is line 1) and
|
||||
the col_offset is the utf8 byte offset of the first token that generated the
|
||||
node. The utf8 offset is recorded because the parser uses utf8 internally.
|
||||
|
||||
If these attributes are marked as optional in the grammar (using a question
|
||||
mark), the value might be ``None``. If the attributes can have zero-or-more
|
||||
values (marked with an asterisk), the values are represented as Python lists.
|
||||
|
||||
|
||||
Abstract Grammar
|
||||
================
|
||||
|
||||
The module defines a string constant ``__version__`` which is the decimal
|
||||
subversion revision number of the file shown below.
|
||||
|
||||
The abstract grammar is currently defined as follows:
|
||||
|
||||
|
||||
.. XXX includefile ../../Parser/Python.asdl
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user