windows.html 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
  6. <meta property="og:title" content="5. Building C and C++ Extensions on Windows" />
  7. <meta property="og:type" content="website" />
  8. <meta property="og:url" content="https://docs.python.org/3/extending/windows.html" />
  9. <meta property="og:site_name" content="Python documentation" />
  10. <meta property="og:description" content="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 ..." />
  11. <meta property="og:image" content="https://docs.python.org/3/_static/og-image.png" />
  12. <meta property="og:image:alt" content="Python documentation" />
  13. <meta name="description" content="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 ..." />
  14. <meta property="og:image:width" content="200" />
  15. <meta property="og:image:height" content="200" />
  16. <meta name="theme-color" content="#3776ab" />
  17. <title>5. Building C and C++ Extensions on Windows &#8212; Python 3.12.0 documentation</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
  18. <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
  19. <link rel="stylesheet" type="text/css" href="../_static/pydoctheme.css?digest=b37c26da2f7529d09fe70b41c4b2133fe4931a90" />
  20. <link id="pygments_dark_css" media="(prefers-color-scheme: dark)" rel="stylesheet" type="text/css" href="../_static/pygments_dark.css" />
  21. <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
  22. <script src="../_static/jquery.js"></script>
  23. <script src="../_static/underscore.js"></script>
  24. <script src="../_static/doctools.js"></script>
  25. <script src="../_static/sidebar.js"></script>
  26. <link rel="search" type="application/opensearchdescription+xml"
  27. title="Search within Python 3.12.0 documentation"
  28. href="../_static/opensearch.xml"/>
  29. <link rel="author" title="About these documents" href="../about.html" />
  30. <link rel="index" title="Index" href="../genindex.html" />
  31. <link rel="search" title="Search" href="../search.html" />
  32. <link rel="copyright" title="Copyright" href="../copyright.html" />
  33. <link rel="next" title="1. Embedding Python in Another Application" href="embedding.html" />
  34. <link rel="prev" title="4. Building C and C++ Extensions" href="building.html" />
  35. <link rel="canonical" href="https://docs.python.org/3/extending/windows.html" />
  36. <style>
  37. @media only screen {
  38. table.full-width-table {
  39. width: 100%;
  40. }
  41. }
  42. </style>
  43. <link rel="stylesheet" href="../_static/pydoctheme_dark.css" media="(prefers-color-scheme: dark)" id="pydoctheme_dark_css">
  44. <link rel="shortcut icon" type="image/png" href="../_static/py.svg" />
  45. <script type="text/javascript" src="../_static/copybutton.js"></script>
  46. <script type="text/javascript" src="../_static/menu.js"></script>
  47. <script type="text/javascript" src="../_static/themetoggle.js"></script>
  48. </head>
  49. <body>
  50. <div class="mobile-nav">
  51. <input type="checkbox" id="menuToggler" class="toggler__input" aria-controls="navigation"
  52. aria-pressed="false" aria-expanded="false" role="button" aria-label="Menu" />
  53. <nav class="nav-content" role="navigation">
  54. <label for="menuToggler" class="toggler__label">
  55. <span></span>
  56. </label>
  57. <span class="nav-items-wrapper">
  58. <a href="https://www.python.org/" class="nav-logo">
  59. <img src="../_static/py.svg" alt="Logo"/>
  60. </a>
  61. <span class="version_switcher_placeholder"></span>
  62. <form role="search" class="search" action="../search.html" method="get">
  63. <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="search-icon">
  64. <path fill-rule="nonzero" fill="currentColor" d="M15.5 14h-.79l-.28-.27a6.5 6.5 0 001.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 00-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 005.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path>
  65. </svg>
  66. <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" />
  67. <input type="submit" value="Go"/>
  68. </form>
  69. </span>
  70. </nav>
  71. <div class="menu-wrapper">
  72. <nav class="menu" role="navigation" aria-label="main navigation">
  73. <div class="language_switcher_placeholder"></div>
  74. <label class="theme-selector-label">
  75. Theme
  76. <select class="theme-selector" oninput="activateTheme(this.value)">
  77. <option value="auto" selected>Auto</option>
  78. <option value="light">Light</option>
  79. <option value="dark">Dark</option>
  80. </select>
  81. </label>
  82. <div>
  83. <h3><a href="../contents.html">Table of Contents</a></h3>
  84. <ul>
  85. <li><a class="reference internal" href="#">5. Building C and C++ Extensions on Windows</a><ul>
  86. <li><a class="reference internal" href="#a-cookbook-approach">5.1. A Cookbook Approach</a></li>
  87. <li><a class="reference internal" href="#differences-between-unix-and-windows">5.2. Differences Between Unix and Windows</a></li>
  88. <li><a class="reference internal" href="#using-dlls-in-practice">5.3. Using DLLs in Practice</a></li>
  89. </ul>
  90. </li>
  91. </ul>
  92. </div>
  93. <div>
  94. <h4>Previous topic</h4>
  95. <p class="topless"><a href="building.html"
  96. title="previous chapter"><span class="section-number">4. </span>Building C and C++ Extensions</a></p>
  97. </div>
  98. <div>
  99. <h4>Next topic</h4>
  100. <p class="topless"><a href="embedding.html"
  101. title="next chapter"><span class="section-number">1. </span>Embedding Python in Another Application</a></p>
  102. </div>
  103. <div role="note" aria-label="source link">
  104. <h3>This Page</h3>
  105. <ul class="this-page-menu">
  106. <li><a href="../bugs.html">Report a Bug</a></li>
  107. <li>
  108. <a href="https://github.com/python/cpython/blob/main/Doc/extending/windows.rst"
  109. rel="nofollow">Show Source
  110. </a>
  111. </li>
  112. </ul>
  113. </div>
  114. </nav>
  115. </div>
  116. </div>
  117. <div class="related" role="navigation" aria-label="related navigation">
  118. <h3>Navigation</h3>
  119. <ul>
  120. <li class="right" style="margin-right: 10px">
  121. <a href="../genindex.html" title="General Index"
  122. accesskey="I">index</a></li>
  123. <li class="right" >
  124. <a href="../py-modindex.html" title="Python Module Index"
  125. >modules</a> |</li>
  126. <li class="right" >
  127. <a href="embedding.html" title="1. Embedding Python in Another Application"
  128. accesskey="N">next</a> |</li>
  129. <li class="right" >
  130. <a href="building.html" title="4. Building C and C++ Extensions"
  131. accesskey="P">previous</a> |</li>
  132. <li><img src="../_static/py.svg" alt="python logo" style="vertical-align: middle; margin-top: -1px"/></li>
  133. <li><a href="https://www.python.org/">Python</a> &#187;</li>
  134. <li class="switchers">
  135. <div class="language_switcher_placeholder"></div>
  136. <div class="version_switcher_placeholder"></div>
  137. </li>
  138. <li>
  139. </li>
  140. <li id="cpython-language-and-version">
  141. <a href="../index.html">3.12.0 Documentation</a> &#187;
  142. </li>
  143. <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Extending and Embedding the Python Interpreter</a> &#187;</li>
  144. <li class="nav-item nav-item-this"><a href=""><span class="section-number">5. </span>Building C and C++ Extensions on Windows</a></li>
  145. <li class="right">
  146. <div class="inline-search" role="search">
  147. <form class="inline-search" action="../search.html" method="get">
  148. <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" />
  149. <input type="submit" value="Go" />
  150. </form>
  151. </div>
  152. |
  153. </li>
  154. <li class="right">
  155. <label class="theme-selector-label">
  156. Theme
  157. <select class="theme-selector" oninput="activateTheme(this.value)">
  158. <option value="auto" selected>Auto</option>
  159. <option value="light">Light</option>
  160. <option value="dark">Dark</option>
  161. </select>
  162. </label> |</li>
  163. </ul>
  164. </div>
  165. <div class="document">
  166. <div class="documentwrapper">
  167. <div class="bodywrapper">
  168. <div class="body" role="main">
  169. <section id="building-c-and-c-extensions-on-windows">
  170. <span id="building-on-windows"></span><h1><span class="section-number">5. </span>Building C and C++ Extensions on Windows<a class="headerlink" href="#building-c-and-c-extensions-on-windows" title="Permalink to this headline">¶</a></h1>
  171. <p>This chapter briefly explains how to create a Windows extension module for
  172. Python using Microsoft Visual C++, and follows with more detailed background
  173. information on how it works. The explanatory material is useful for both the
  174. Windows programmer learning to build Python extensions and the Unix programmer
  175. interested in producing software which can be successfully built on both Unix
  176. and Windows.</p>
  177. <p>Module authors are encouraged to use the distutils approach for building
  178. extension modules, instead of the one described in this section. You will still
  179. need the C compiler that was used to build Python; typically Microsoft Visual
  180. C++.</p>
  181. <div class="admonition note">
  182. <p class="admonition-title">Note</p>
  183. <p>This chapter mentions a number of filenames that include an encoded Python
  184. version number. These filenames are represented with the version number shown
  185. as <code class="docutils literal notranslate"><span class="pre">XY</span></code>; in practice, <code class="docutils literal notranslate"><span class="pre">'X'</span></code> will be the major version number and <code class="docutils literal notranslate"><span class="pre">'Y'</span></code>
  186. will be the minor version number of the Python release you’re working with. For
  187. example, if you are using Python 2.2.1, <code class="docutils literal notranslate"><span class="pre">XY</span></code> will actually be <code class="docutils literal notranslate"><span class="pre">22</span></code>.</p>
  188. </div>
  189. <section id="a-cookbook-approach">
  190. <span id="win-cookbook"></span><h2><span class="section-number">5.1. </span>A Cookbook Approach<a class="headerlink" href="#a-cookbook-approach" title="Permalink to this headline">¶</a></h2>
  191. <p>There are two approaches to building extension modules on Windows, just as there
  192. are on Unix: use the <code class="docutils literal notranslate"><span class="pre">setuptools</span></code> package to control the build process, or
  193. do things manually. The setuptools approach works well for most extensions;
  194. documentation on using <code class="docutils literal notranslate"><span class="pre">setuptools</span></code> to build and package extension modules
  195. is available in <a class="reference internal" href="building.html#setuptools-index"><span class="std std-ref">Building C and C++ Extensions with setuptools</span></a>. If you find you really need to do
  196. things manually, it may be instructive to study the project file for the
  197. <a class="reference external" href="https://github.com/python/cpython/tree/3.12/PCbuild/winsound.vcxproj">winsound</a> standard library module.</p>
  198. </section>
  199. <section id="differences-between-unix-and-windows">
  200. <span id="dynamic-linking"></span><h2><span class="section-number">5.2. </span>Differences Between Unix and Windows<a class="headerlink" href="#differences-between-unix-and-windows" title="Permalink to this headline">¶</a></h2>
  201. <p>Unix and Windows use completely different paradigms for run-time loading of
  202. code. Before you try to build a module that can be dynamically loaded, be aware
  203. of how your system works.</p>
  204. <p>In Unix, a shared object (<code class="file docutils literal notranslate"><span class="pre">.so</span></code>) file contains code to be used by the
  205. program, and also the names of functions and data that it expects to find in the
  206. program. When the file is joined to the program, all references to those
  207. functions and data in the file’s code are changed to point to the actual
  208. locations in the program where the functions and data are placed in memory.
  209. This is basically a link operation.</p>
  210. <p>In Windows, a dynamic-link library (<code class="file docutils literal notranslate"><span class="pre">.dll</span></code>) file has no dangling
  211. references. Instead, an access to functions or data goes through a lookup
  212. table. So the DLL code does not have to be fixed up at runtime to refer to the
  213. program’s memory; instead, the code already uses the DLL’s lookup table, and the
  214. lookup table is modified at runtime to point to the functions and data.</p>
  215. <p>In Unix, there is only one type of library file (<code class="file docutils literal notranslate"><span class="pre">.a</span></code>) which contains code
  216. from several object files (<code class="file docutils literal notranslate"><span class="pre">.o</span></code>). During the link step to create a shared
  217. object file (<code class="file docutils literal notranslate"><span class="pre">.so</span></code>), the linker may find that it doesn’t know where an
  218. identifier is defined. The linker will look for it in the object files in the
  219. libraries; if it finds it, it will include all the code from that object file.</p>
  220. <p>In Windows, there are two types of library, a static library and an import
  221. library (both called <code class="file docutils literal notranslate"><span class="pre">.lib</span></code>). A static library is like a Unix <code class="file docutils literal notranslate"><span class="pre">.a</span></code>
  222. file; it contains code to be included as necessary. An import library is
  223. basically used only to reassure the linker that a certain identifier is legal,
  224. and will be present in the program when the DLL is loaded. So the linker uses
  225. the information from the import library to build the lookup table for using
  226. identifiers that are not included in the DLL. When an application or a DLL is
  227. linked, an import library may be generated, which will need to be used for all
  228. future DLLs that depend on the symbols in the application or DLL.</p>
  229. <p>Suppose you are building two dynamic-load modules, B and C, which should share
  230. another block of code A. On Unix, you would <em>not</em> pass <code class="file docutils literal notranslate"><span class="pre">A.a</span></code> to the
  231. linker for <code class="file docutils literal notranslate"><span class="pre">B.so</span></code> and <code class="file docutils literal notranslate"><span class="pre">C.so</span></code>; that would cause it to be included
  232. twice, so that B and C would each have their own copy. In Windows, building
  233. <code class="file docutils literal notranslate"><span class="pre">A.dll</span></code> will also build <code class="file docutils literal notranslate"><span class="pre">A.lib</span></code>. You <em>do</em> pass <code class="file docutils literal notranslate"><span class="pre">A.lib</span></code> to the
  234. linker for B and C. <code class="file docutils literal notranslate"><span class="pre">A.lib</span></code> does not contain code; it just contains
  235. information which will be used at runtime to access A’s code.</p>
  236. <p>In Windows, using an import library is sort of like using <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">spam</span></code>; it
  237. gives you access to spam’s names, but does not create a separate copy. On Unix,
  238. linking with a library is more like <code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">spam</span> <span class="pre">import</span> <span class="pre">*</span></code>; it does create a
  239. separate copy.</p>
  240. </section>
  241. <section id="using-dlls-in-practice">
  242. <span id="win-dlls"></span><h2><span class="section-number">5.3. </span>Using DLLs in Practice<a class="headerlink" href="#using-dlls-in-practice" title="Permalink to this headline">¶</a></h2>
  243. <p>Windows Python is built in Microsoft Visual C++; using other compilers may or
  244. may not work. The rest of this section is MSVC++ specific.</p>
  245. <p>When creating DLLs in Windows, you must pass <code class="file docutils literal notranslate"><span class="pre">pythonXY.lib</span></code> to the linker.
  246. To build two DLLs, spam and ni (which uses C functions found in spam), you could
  247. use these commands:</p>
  248. <div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="n">cl</span><span class="w"> </span><span class="o">/</span><span class="n">LD</span><span class="w"> </span><span class="o">/</span><span class="n">I</span><span class="o">/</span><span class="n">python</span><span class="o">/</span><span class="n">include</span><span class="w"> </span><span class="n">spam</span><span class="p">.</span><span class="n">c</span><span class="w"> </span><span class="p">..</span><span class="o">/</span><span class="n">libs</span><span class="o">/</span><span class="n">pythonXY</span><span class="p">.</span><span class="n">lib</span>
  249. <span class="n">cl</span><span class="w"> </span><span class="o">/</span><span class="n">LD</span><span class="w"> </span><span class="o">/</span><span class="n">I</span><span class="o">/</span><span class="n">python</span><span class="o">/</span><span class="n">include</span><span class="w"> </span><span class="n">ni</span><span class="p">.</span><span class="n">c</span><span class="w"> </span><span class="n">spam</span><span class="p">.</span><span class="n">lib</span><span class="w"> </span><span class="p">..</span><span class="o">/</span><span class="n">libs</span><span class="o">/</span><span class="n">pythonXY</span><span class="p">.</span><span class="n">lib</span>
  250. </pre></div>
  251. </div>
  252. <p>The first command created three files: <code class="file docutils literal notranslate"><span class="pre">spam.obj</span></code>, <code class="file docutils literal notranslate"><span class="pre">spam.dll</span></code> and
  253. <code class="file docutils literal notranslate"><span class="pre">spam.lib</span></code>. <code class="file docutils literal notranslate"><span class="pre">Spam.dll</span></code> does not contain any Python functions (such
  254. as <a class="reference internal" href="../c-api/arg.html#c.PyArg_ParseTuple" title="PyArg_ParseTuple"><code class="xref c c-func docutils literal notranslate"><span class="pre">PyArg_ParseTuple()</span></code></a>), but it does know how to find the Python code
  255. thanks to <code class="file docutils literal notranslate"><span class="pre">pythonXY.lib</span></code>.</p>
  256. <p>The second command created <code class="file docutils literal notranslate"><span class="pre">ni.dll</span></code> (and <code class="file docutils literal notranslate"><span class="pre">.obj</span></code> and <code class="file docutils literal notranslate"><span class="pre">.lib</span></code>),
  257. which knows how to find the necessary functions from spam, and also from the
  258. Python executable.</p>
  259. <p>Not every identifier is exported to the lookup table. If you want any other
  260. modules (including Python) to be able to see your identifiers, you have to say
  261. <code class="docutils literal notranslate"><span class="pre">_declspec(dllexport)</span></code>, as in <code class="docutils literal notranslate"><span class="pre">void</span> <span class="pre">_declspec(dllexport)</span> <span class="pre">initspam(void)</span></code> or
  262. <code class="docutils literal notranslate"><span class="pre">PyObject</span> <span class="pre">_declspec(dllexport)</span> <span class="pre">*NiGetSpamData(void)</span></code>.</p>
  263. <p>Developer Studio will throw in a lot of import libraries that you do not really
  264. need, adding about 100K to your executable. To get rid of them, use the Project
  265. Settings dialog, Link tab, to specify <em>ignore default libraries</em>. Add the
  266. correct <code class="file docutils literal notranslate"><span class="pre">msvcrt</span><em><span class="pre">xx</span></em><span class="pre">.lib</span></code> to the list of libraries.</p>
  267. </section>
  268. </section>
  269. <div class="clearer"></div>
  270. </div>
  271. </div>
  272. </div>
  273. <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
  274. <div class="sphinxsidebarwrapper">
  275. <div>
  276. <h3><a href="../contents.html">Table of Contents</a></h3>
  277. <ul>
  278. <li><a class="reference internal" href="#">5. Building C and C++ Extensions on Windows</a><ul>
  279. <li><a class="reference internal" href="#a-cookbook-approach">5.1. A Cookbook Approach</a></li>
  280. <li><a class="reference internal" href="#differences-between-unix-and-windows">5.2. Differences Between Unix and Windows</a></li>
  281. <li><a class="reference internal" href="#using-dlls-in-practice">5.3. Using DLLs in Practice</a></li>
  282. </ul>
  283. </li>
  284. </ul>
  285. </div>
  286. <div>
  287. <h4>Previous topic</h4>
  288. <p class="topless"><a href="building.html"
  289. title="previous chapter"><span class="section-number">4. </span>Building C and C++ Extensions</a></p>
  290. </div>
  291. <div>
  292. <h4>Next topic</h4>
  293. <p class="topless"><a href="embedding.html"
  294. title="next chapter"><span class="section-number">1. </span>Embedding Python in Another Application</a></p>
  295. </div>
  296. <div role="note" aria-label="source link">
  297. <h3>This Page</h3>
  298. <ul class="this-page-menu">
  299. <li><a href="../bugs.html">Report a Bug</a></li>
  300. <li>
  301. <a href="https://github.com/python/cpython/blob/main/Doc/extending/windows.rst"
  302. rel="nofollow">Show Source
  303. </a>
  304. </li>
  305. </ul>
  306. </div>
  307. </div>
  308. </div>
  309. <div class="clearer"></div>
  310. </div>
  311. <div class="related" role="navigation" aria-label="related navigation">
  312. <h3>Navigation</h3>
  313. <ul>
  314. <li class="right" style="margin-right: 10px">
  315. <a href="../genindex.html" title="General Index"
  316. >index</a></li>
  317. <li class="right" >
  318. <a href="../py-modindex.html" title="Python Module Index"
  319. >modules</a> |</li>
  320. <li class="right" >
  321. <a href="embedding.html" title="1. Embedding Python in Another Application"
  322. >next</a> |</li>
  323. <li class="right" >
  324. <a href="building.html" title="4. Building C and C++ Extensions"
  325. >previous</a> |</li>
  326. <li><img src="../_static/py.svg" alt="python logo" style="vertical-align: middle; margin-top: -1px"/></li>
  327. <li><a href="https://www.python.org/">Python</a> &#187;</li>
  328. <li class="switchers">
  329. <div class="language_switcher_placeholder"></div>
  330. <div class="version_switcher_placeholder"></div>
  331. </li>
  332. <li>
  333. </li>
  334. <li id="cpython-language-and-version">
  335. <a href="../index.html">3.12.0 Documentation</a> &#187;
  336. </li>
  337. <li class="nav-item nav-item-1"><a href="index.html" >Extending and Embedding the Python Interpreter</a> &#187;</li>
  338. <li class="nav-item nav-item-this"><a href=""><span class="section-number">5. </span>Building C and C++ Extensions on Windows</a></li>
  339. <li class="right">
  340. <div class="inline-search" role="search">
  341. <form class="inline-search" action="../search.html" method="get">
  342. <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" />
  343. <input type="submit" value="Go" />
  344. </form>
  345. </div>
  346. |
  347. </li>
  348. <li class="right">
  349. <label class="theme-selector-label">
  350. Theme
  351. <select class="theme-selector" oninput="activateTheme(this.value)">
  352. <option value="auto" selected>Auto</option>
  353. <option value="light">Light</option>
  354. <option value="dark">Dark</option>
  355. </select>
  356. </label> |</li>
  357. </ul>
  358. </div>
  359. <div class="footer">
  360. &copy; <a href="../copyright.html">Copyright</a> 2001-2023, Python Software Foundation.
  361. <br />
  362. This page is licensed under the Python Software Foundation License Version 2.
  363. <br />
  364. Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
  365. <br />
  366. See <a href="/license.html">History and License</a> for more information.<br />
  367. <br />
  368. The Python Software Foundation is a non-profit corporation.
  369. <a href="https://www.python.org/psf/donations/">Please donate.</a>
  370. <br />
  371. <br />
  372. Last updated on Oct 02, 2023.
  373. <a href="/bugs.html">Found a bug</a>?
  374. <br />
  375. Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.5.0.
  376. </div>
  377. </body>
  378. </html>