Merge from 3.2

This commit is contained in:
Antoine Pitrou 2011-12-03 22:40:23 +01:00
commit 61fed9ccd3
2 changed files with 17 additions and 48 deletions

View File

@ -99,12 +99,7 @@ many other useful protocols.
How do I use Py_BuildValue() to create a tuple of arbitrary length? How do I use Py_BuildValue() to create a tuple of arbitrary length?
------------------------------------------------------------------- -------------------------------------------------------------------
You can't. Use ``t = PyTuple_New(n)`` instead, and fill it with objects using You can't. Use :c:func:`PyTuple_Pack` instead.
``PyTuple_SetItem(t, i, o)`` -- note that this "eats" a reference count of
``o``, so you have to :c:func:`Py_INCREF` it. Lists have similar functions
``PyList_New(n)`` and ``PyList_SetItem(l, i, o)``. Note that you *must* set all
the tuple items to some value before you pass the tuple to Python code --
``PyTuple_New(n)`` initializes them to NULL, which isn't a valid Python value.
How do I call an object's method from C? How do I call an object's method from C?
@ -147,21 +142,30 @@ this object to :data:`sys.stdout` and :data:`sys.stderr`. Call print_error, or
just allow the standard traceback mechanism to work. Then, the output will go just allow the standard traceback mechanism to work. Then, the output will go
wherever your ``write()`` method sends it. wherever your ``write()`` method sends it.
The easiest way to do this is to use the StringIO class in the standard library. The easiest way to do this is to use the :class:`io.StringIO` class::
Sample code and use for catching stdout: >>> import io, sys
>>> sys.stdout = io.StringIO()
>>> print('foo')
>>> print('hello world!')
>>> sys.stderr.write(sys.stdout.getvalue())
foo
hello world!
>>> class StdoutCatcher: A custom object to do the same would look like this::
>>> import io, sys
>>> class StdoutCatcher(io.TextIOBase):
... def __init__(self): ... def __init__(self):
... self.data = '' ... self.data = []
... def write(self, stuff): ... def write(self, stuff):
... self.data = self.data + stuff ... self.data.append(stuff)
... ...
>>> import sys >>> import sys
>>> sys.stdout = StdoutCatcher() >>> sys.stdout = StdoutCatcher()
>>> print('foo') >>> print('foo')
>>> print('hello world!') >>> print('hello world!')
>>> sys.stderr.write(sys.stdout.data) >>> sys.stderr.write(''.join(sys.stdout.data))
foo foo
hello world! hello world!

View File

@ -19,7 +19,7 @@ It has interfaces to many system calls and libraries, as well as to various
window systems, and is extensible in C or C++. It is also usable as an window systems, and is extensible in C or C++. It is also usable as an
extension language for applications that need a programmable interface. extension language for applications that need a programmable interface.
Finally, Python is portable: it runs on many Unix variants, on the Mac, and on Finally, Python is portable: it runs on many Unix variants, on the Mac, and on
PCs under MS-DOS, Windows, Windows NT, and OS/2. Windows 2000 and later.
To find out more, start with :ref:`tutorial-index`. The `Beginner's Guide to To find out more, start with :ref:`tutorial-index`. The `Beginner's Guide to
Python <http://wiki.python.org/moin/BeginnersGuide>`_ links to other Python <http://wiki.python.org/moin/BeginnersGuide>`_ links to other
@ -469,38 +469,3 @@ http://www.python.org/editors/ for a full list of Python editing environments.
If you want to discuss Python's use in education, you may be interested in If you want to discuss Python's use in education, you may be interested in
joining `the edu-sig mailing list joining `the edu-sig mailing list
<http://python.org/community/sigs/current/edu-sig>`_. <http://python.org/community/sigs/current/edu-sig>`_.
Upgrading Python
================
What is this bsddb185 module my application keeps complaining about?
--------------------------------------------------------------------
.. XXX remove this question?
Starting with Python2.3, the distribution includes the `PyBSDDB package
<http://pybsddb.sf.net/>` as a replacement for the old bsddb module. It
includes functions which provide backward compatibility at the API level, but
requires a newer version of the underlying `Berkeley DB
<http://www.sleepycat.com>`_ library. Files created with the older bsddb module
can't be opened directly using the new module.
Using your old version of Python and a pair of scripts which are part of Python
2.3 (db2pickle.py and pickle2db.py, in the Tools/scripts directory) you can
convert your old database files to the new format. Using your old Python
version, run the db2pickle.py script to convert it to a pickle, e.g.::
python2.2 <pathto>/db2pickley.py database.db database.pck
Rename your database file::
mv database.db olddatabase.db
Now convert the pickle file to a new format database::
python <pathto>/pickle2db.py database.db database.pck
The precise commands you use will vary depending on the particulars of your
installation. For full details about operation of these two scripts check the
doc string at the start of each one.