Skip to content

Commit c3c8806

Browse files
vstinnerencukouzooba
authored
gh-133678: Document C API third party tools (#134526)
Co-authored-by: Petr Viktorin <[email protected]> Co-authored-by: Steve Dower <[email protected]>
1 parent f6f4e8a commit c3c8806

File tree

4 files changed

+46
-35
lines changed

4 files changed

+46
-35
lines changed

Doc/c-api/intro.rst

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -838,3 +838,41 @@ after every statement run by the interpreter.)
838838

839839
Please refer to :file:`Misc/SpecialBuilds.txt` in the Python source distribution
840840
for more detailed information.
841+
842+
843+
.. _c-api-tools:
844+
845+
Recommended third party tools
846+
=============================
847+
848+
The following third party tools offer both simpler and more sophisticated
849+
approaches to creating C, C++ and Rust extensions for Python:
850+
851+
* `Cython <https://cython.org/>`_
852+
* `cffi <https://cffi.readthedocs.io>`_
853+
* `HPy <https://hpyproject.org/>`_
854+
* `nanobind <https://github.com/wjakob/nanobind>`_ (C++)
855+
* `Numba <https://numba.pydata.org/>`_
856+
* `pybind11 <https://pybind11.readthedocs.io/>`_ (C++)
857+
* `PyO3 <https://pyo3.rs/>`_ (Rust)
858+
* `SWIG <https://www.swig.org>`_
859+
860+
Using tools such as these can help avoid writing code that is tightly bound to
861+
a particular version of CPython, avoid reference counting errors, and focus
862+
more on your own code than on using the CPython API. In general, new versions
863+
of Python can be supported by updating the tool, and your code will often use
864+
newer and more efficient APIs automatically. Some tools also support compiling
865+
for other implementations of Python from a single set of sources.
866+
867+
These projects are not supported by the same people who maintain Python, and
868+
issues need to be raised with the projects directly. Remember to check that the
869+
project is still maintained and supported, as the list above may become
870+
outdated.
871+
872+
.. seealso::
873+
874+
`Python Packaging User Guide: Binary Extensions <https://packaging.python.org/guides/packaging-binary-extensions/>`_
875+
The Python Packaging User Guide not only covers several available
876+
tools that simplify the creation of binary extensions, but also
877+
discusses the various reasons why creating an extension module may be
878+
desirable in the first place.

Doc/extending/index.rst

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,9 @@ Recommended third party tools
2626
=============================
2727

2828
This guide only covers the basic tools for creating extensions provided
29-
as part of this version of CPython. Third party tools like
30-
`Cython <https://cython.org/>`_, `cffi <https://cffi.readthedocs.io>`_,
31-
`SWIG <https://www.swig.org>`_ and `Numba <https://numba.pydata.org/>`_
32-
offer both simpler and more sophisticated approaches to creating C and C++
33-
extensions for Python.
34-
35-
.. seealso::
36-
37-
`Python Packaging User Guide: Binary Extensions <https://packaging.python.org/guides/packaging-binary-extensions/>`_
38-
The Python Packaging User Guide not only covers several available
39-
tools that simplify the creation of binary extensions, but also
40-
discusses the various reasons why creating an extension module may be
41-
desirable in the first place.
29+
as part of this version of CPython. Some :ref:`third party tools
30+
<c-api-tools>` offer both simpler and more sophisticated approaches to creating
31+
C and C++ extensions for Python.
4232

4333

4434
Creating extensions without third party tools

Doc/faq/extending.rst

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -37,24 +37,9 @@ Writing C is hard; are there any alternatives?
3737
----------------------------------------------
3838

3939
There are a number of alternatives to writing your own C extensions, depending
40-
on what you're trying to do.
41-
42-
.. XXX make sure these all work
43-
44-
`Cython <https://cython.org>`_ and its relative `Pyrex
45-
<https://www.csse.canterbury.ac.nz/greg.ewing/python/Pyrex/>`_ are compilers
46-
that accept a slightly modified form of Python and generate the corresponding
47-
C code. Cython and Pyrex make it possible to write an extension without having
48-
to learn Python's C API.
49-
50-
If you need to interface to some C or C++ library for which no Python extension
51-
currently exists, you can try wrapping the library's data types and functions
52-
with a tool such as `SWIG <https://www.swig.org>`_. `SIP
53-
<https://github.com/Python-SIP/sip>`__, `CXX
54-
<https://cxx.sourceforge.net/>`_ `Boost
55-
<https://www.boost.org/libs/python/doc/index.html>`_, or `Weave
56-
<https://github.com/scipy/weave>`_ are also
57-
alternatives for wrapping C++ libraries.
40+
on what you're trying to do. :ref:`Recommended third party tools <c-api-tools>`
41+
offer both simpler and more sophisticated approaches to creating C and C++
42+
extensions for Python.
5843

5944

6045
How can I execute arbitrary Python statements from C?

Doc/howto/cporting.rst

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,11 @@ We recommend the following resources for porting extension modules to Python 3:
1414
module.
1515
* The `Porting guide`_ from the *py3c* project provides opinionated
1616
suggestions with supporting code.
17-
* The `Cython`_ and `CFFI`_ libraries offer abstractions over
18-
Python's C API.
17+
* :ref:`Recommended third party tools <c-api-tools>` offer abstractions over
18+
the Python's C API.
1919
Extensions generally need to be re-written to use one of them,
2020
but the library then handles differences between various Python
2121
versions and implementations.
2222

2323
.. _Migrating C extensions: http://python3porting.com/cextensions.html
2424
.. _Porting guide: https://py3c.readthedocs.io/en/latest/guide.html
25-
.. _Cython: https://cython.org/
26-
.. _CFFI: https://cffi.readthedocs.io/en/latest/

0 commit comments

Comments
 (0)