Hi Antoine,<br><br>The rules to decide what goes where have been discussed in the issues which created Include/cpython/ and the issue moving more headers to Include/internal/.<br><br>In short, internal/ should not be used outside CPython codebase. In Python 3.7, these headers were even not installed. I chose to install them because I moved more headers into internal/ which is a backward incompatible change. You should not use these headers outside CPython code base, but the typical use case to use them are debug tools: debugger, tracer and profiler. The internal/ subdir is not included in Python default search path when you use python-config --cflags for example. It is a deliberate choice that these headers are not easily accessible.<br><br>There file names are prefixed by pycore_ for practical reasons: if 2 header files have the same name in internal/ and Include/, the C preprocessor can pick the wrong one. See the internal/ issue which gives a concrete example (but in Python 3.7).<br><br>cpython/ is just a practical separation to force developers to decide if a new API is part of the stable API or not. Previously, too many APIs have been added to the stable API by mistake (not on purpose).<br><br>About inconsistencies, I invite you to open issues. I worked by small steps. I tried to not move too much code from "one API" (stable, cpython, internal) to another. IMHO all _Init() and _Fini() APIs must be internal. For historical reasons, they are even part of the public API (!) which is a mistake. I don't see the point of calling them explicitly.<br><br>I tried to take notes at <a href="https://pythoncapi.readthedocs.io/">https://pythoncapi.readthedocs.io/</a> for the rationale, examples and track progess, but I didn't update this site with the work I did last 6 months.<br><br>I hope that it makes more sense to you now?<br><br>Victor<br><br><br>Le dimanche 3 février 2019, Antoine Pitrou <<a href="mailto:solipsis@pitrou.net">solipsis@pitrou.net</a>> a écrit :<br>><br>> Hello,<br>><br>> Can someone explain why we have two separate directories<br>> Include/internal and Include/cpython?  What is the rule for declaring an<br>> API inside one or another?<br>><br>> At first sight, it seems to me we're having gratuitous complication<br>> here.  For example, I notice that PyFloat_Fini() is declared in<br>> Include/cpython/pylifecycle.h but PyLong_Fini() is declared in<br>> Include/internal/pycore_pylifecycle.h?<br>><br>> (and why the additional "pycore_XXX.h" naming convention for some of<br>> those files?)<br>><br>> Regards<br>><br>> Antoine.<br>><br>><br>> _______________________________________________<br>> Python-Dev mailing list<br>> <a href="mailto:Python-Dev@python.org">Python-Dev@python.org</a><br>> <a href="https://mail.python.org/mailman/listinfo/python-dev">https://mail.python.org/mailman/listinfo/python-dev</a><br>> Unsubscribe: <a href="https://mail.python.org/mailman/options/python-dev/vstinner%40redhat.com">https://mail.python.org/mailman/options/python-dev/vstinner%40redhat.com</a><br>><br><br>-- <br>Night gathers, and now my watch begins. It shall not end until my death.<br>