mirror of
				https://github.com/bunny-lab-io/Borealis.git
				synced 2025-10-30 00:01:57 -06:00 
			
		
		
		
	
		
			
				
	
	
		
			1674 lines
		
	
	
		
			120 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			1674 lines
		
	
	
		
			120 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!DOCTYPE html>
 | ||
| 
 | ||
| <html lang="en" data-content_root="../">
 | ||
|   <head>
 | ||
|     <meta charset="utf-8" />
 | ||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
 | ||
| <meta property="og:title" content="4. Using Python on Windows" />
 | ||
| <meta property="og:type" content="website" />
 | ||
| <meta property="og:url" content="https://docs.python.org/3/using/windows.html" />
 | ||
| <meta property="og:site_name" content="Python documentation" />
 | ||
| <meta property="og:description" content="This document aims to give an overview of Windows-specific behaviour you should know about when using Python on Microsoft Windows. Unlike most Unix systems and services, Windows does not include a ..." />
 | ||
| <meta property="og:image" content="https://docs.python.org/3/_static/og-image.png" />
 | ||
| <meta property="og:image:alt" content="Python documentation" />
 | ||
| <meta name="description" content="This document aims to give an overview of Windows-specific behaviour you should know about when using Python on Microsoft Windows. Unlike most Unix systems and services, Windows does not include a ..." />
 | ||
| <meta property="og:image:width" content="200">
 | ||
| <meta property="og:image:height" content="200">
 | ||
| <meta name="theme-color" content="#3776ab">
 | ||
| 
 | ||
|     <title>4. Using Python on Windows — Python 3.13.3 documentation</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
 | ||
|     
 | ||
|     <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=b86133f3" />
 | ||
|     <link rel="stylesheet" type="text/css" href="../_static/pydoctheme.css?v=23252803" />
 | ||
|     <link id="pygments_dark_css" media="(prefers-color-scheme: dark)" rel="stylesheet" type="text/css" href="../_static/pygments_dark.css?v=5349f25f" />
 | ||
|     
 | ||
|     <script src="../_static/documentation_options.js?v=5d57ca2d"></script>
 | ||
|     <script src="../_static/doctools.js?v=9bcbadda"></script>
 | ||
|     <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
 | ||
|     
 | ||
|     <script src="../_static/sidebar.js"></script>
 | ||
|     
 | ||
|     <link rel="search" type="application/opensearchdescription+xml"
 | ||
|           title="Search within Python 3.13.3 documentation"
 | ||
|           href="../_static/opensearch.xml"/>
 | ||
|     <link rel="author" title="About these documents" href="../about.html" />
 | ||
|     <link rel="index" title="Index" href="../genindex.html" />
 | ||
|     <link rel="search" title="Search" href="../search.html" />
 | ||
|     <link rel="copyright" title="Copyright" href="../copyright.html" />
 | ||
|     <link rel="next" title="5. Using Python on macOS" href="mac.html" />
 | ||
|     <link rel="prev" title="3. Configure Python" href="configure.html" />
 | ||
|     
 | ||
|     <link rel="canonical" href="https://docs.python.org/3/using/windows.html">
 | ||
|     
 | ||
|       
 | ||
|     
 | ||
| 
 | ||
|     
 | ||
|     <style>
 | ||
|       @media only screen {
 | ||
|         table.full-width-table {
 | ||
|             width: 100%;
 | ||
|         }
 | ||
|       }
 | ||
|     </style>
 | ||
| <link rel="stylesheet" href="../_static/pydoctheme_dark.css" media="(prefers-color-scheme: dark)" id="pydoctheme_dark_css">
 | ||
|     <link rel="shortcut icon" type="image/png" href="../_static/py.svg" />
 | ||
|             <script type="text/javascript" src="../_static/copybutton.js"></script>
 | ||
|             <script type="text/javascript" src="../_static/menu.js"></script>
 | ||
|             <script type="text/javascript" src="../_static/search-focus.js"></script>
 | ||
|             <script type="text/javascript" src="../_static/themetoggle.js"></script> 
 | ||
|             <script type="text/javascript" src="../_static/rtd_switcher.js"></script>
 | ||
|             <meta name="readthedocs-addons-api-version" content="1">
 | ||
| 
 | ||
|   </head>
 | ||
| <body>
 | ||
| <div class="mobile-nav">
 | ||
|     <input type="checkbox" id="menuToggler" class="toggler__input" aria-controls="navigation"
 | ||
|            aria-pressed="false" aria-expanded="false" role="button" aria-label="Menu" />
 | ||
|     <nav class="nav-content" role="navigation">
 | ||
|         <label for="menuToggler" class="toggler__label">
 | ||
|             <span></span>
 | ||
|         </label>
 | ||
|         <span class="nav-items-wrapper">
 | ||
|             <a href="https://www.python.org/" class="nav-logo">
 | ||
|                 <img src="../_static/py.svg" alt="Python logo"/>
 | ||
|             </a>
 | ||
|             <span class="version_switcher_placeholder"></span>
 | ||
|             <form role="search" class="search" action="../search.html" method="get">
 | ||
|                 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="search-icon">
 | ||
|                     <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>
 | ||
|                 </svg>
 | ||
|                 <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" />
 | ||
|                 <input type="submit" value="Go"/>
 | ||
|             </form>
 | ||
|         </span>
 | ||
|     </nav>
 | ||
|     <div class="menu-wrapper">
 | ||
|         <nav class="menu" role="navigation" aria-label="main navigation">
 | ||
|             <div class="language_switcher_placeholder"></div>
 | ||
|             
 | ||
| <label class="theme-selector-label">
 | ||
|     Theme
 | ||
|     <select class="theme-selector" oninput="activateTheme(this.value)">
 | ||
|         <option value="auto" selected>Auto</option>
 | ||
|         <option value="light">Light</option>
 | ||
|         <option value="dark">Dark</option>
 | ||
|     </select>
 | ||
| </label>
 | ||
|   <div>
 | ||
|     <h3><a href="../contents.html">Table of Contents</a></h3>
 | ||
|     <ul>
 | ||
| <li><a class="reference internal" href="#">4. Using Python on Windows</a><ul>
 | ||
| <li><a class="reference internal" href="#the-full-installer">4.1. The full installer</a><ul>
 | ||
| <li><a class="reference internal" href="#installation-steps">4.1.1. Installation steps</a></li>
 | ||
| <li><a class="reference internal" href="#removing-the-max-path-limitation">4.1.2. Removing the MAX_PATH Limitation</a></li>
 | ||
| <li><a class="reference internal" href="#installing-without-ui">4.1.3. Installing Without UI</a></li>
 | ||
| <li><a class="reference internal" href="#installing-without-downloading">4.1.4. Installing Without Downloading</a></li>
 | ||
| <li><a class="reference internal" href="#modifying-an-install">4.1.5. Modifying an install</a></li>
 | ||
| <li><a class="reference internal" href="#installing-free-threaded-binaries">4.1.6. Installing Free-threaded Binaries</a></li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| <li><a class="reference internal" href="#the-microsoft-store-package">4.2. The Microsoft Store package</a><ul>
 | ||
| <li><a class="reference internal" href="#known-issues">4.2.1. Known issues</a><ul>
 | ||
| <li><a class="reference internal" href="#redirection-of-local-data-registry-and-temporary-paths">4.2.1.1. Redirection of local data, registry, and temporary paths</a></li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| <li><a class="reference internal" href="#the-nuget-org-packages">4.3. The nuget.org packages</a><ul>
 | ||
| <li><a class="reference internal" href="#free-threaded-packages">4.3.1. Free-threaded packages</a></li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| <li><a class="reference internal" href="#the-embeddable-package">4.4. The embeddable package</a><ul>
 | ||
| <li><a class="reference internal" href="#python-application">4.4.1. Python Application</a></li>
 | ||
| <li><a class="reference internal" href="#embedding-python">4.4.2. Embedding Python</a></li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| <li><a class="reference internal" href="#alternative-bundles">4.5. Alternative bundles</a></li>
 | ||
| <li><a class="reference internal" href="#configuring-python">4.6. Configuring Python</a><ul>
 | ||
| <li><a class="reference internal" href="#excursus-setting-environment-variables">4.6.1. Excursus: Setting environment variables</a></li>
 | ||
| <li><a class="reference internal" href="#finding-the-python-executable">4.6.2. Finding the Python executable</a></li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| <li><a class="reference internal" href="#utf-8-mode">4.7. UTF-8 mode</a></li>
 | ||
| <li><a class="reference internal" href="#python-launcher-for-windows">4.8. Python Launcher for Windows</a><ul>
 | ||
| <li><a class="reference internal" href="#getting-started">4.8.1. Getting started</a><ul>
 | ||
| <li><a class="reference internal" href="#from-the-command-line">4.8.1.1. From the command-line</a></li>
 | ||
| <li><a class="reference internal" href="#virtual-environments">4.8.1.2. Virtual environments</a></li>
 | ||
| <li><a class="reference internal" href="#from-a-script">4.8.1.3. From a script</a></li>
 | ||
| <li><a class="reference internal" href="#from-file-associations">4.8.1.4. From file associations</a></li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| <li><a class="reference internal" href="#shebang-lines">4.8.2. Shebang Lines</a></li>
 | ||
| <li><a class="reference internal" href="#arguments-in-shebang-lines">4.8.3. Arguments in shebang lines</a></li>
 | ||
| <li><a class="reference internal" href="#customization">4.8.4. Customization</a><ul>
 | ||
| <li><a class="reference internal" href="#customization-via-ini-files">4.8.4.1. Customization via INI files</a></li>
 | ||
| <li><a class="reference internal" href="#customizing-default-python-versions">4.8.4.2. Customizing default Python versions</a></li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| <li><a class="reference internal" href="#diagnostics">4.8.5. Diagnostics</a></li>
 | ||
| <li><a class="reference internal" href="#dry-run">4.8.6. Dry Run</a></li>
 | ||
| <li><a class="reference internal" href="#install-on-demand">4.8.7. Install on demand</a></li>
 | ||
| <li><a class="reference internal" href="#return-codes">4.8.8. Return codes</a></li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| <li><a class="reference internal" href="#finding-modules">4.9. Finding modules</a></li>
 | ||
| <li><a class="reference internal" href="#additional-modules">4.10. Additional modules</a><ul>
 | ||
| <li><a class="reference internal" href="#pywin32">4.10.1. PyWin32</a></li>
 | ||
| <li><a class="reference internal" href="#cx-freeze">4.10.2. cx_Freeze</a></li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| <li><a class="reference internal" href="#compiling-python-on-windows">4.11. Compiling Python on Windows</a></li>
 | ||
| <li><a class="reference internal" href="#other-platforms">4.12. Other Platforms</a></li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| </ul>
 | ||
| 
 | ||
|   </div>
 | ||
|   <div>
 | ||
|     <h4>Previous topic</h4>
 | ||
|     <p class="topless"><a href="configure.html"
 | ||
|                           title="previous chapter"><span class="section-number">3. </span>Configure Python</a></p>
 | ||
|   </div>
 | ||
|   <div>
 | ||
|     <h4>Next topic</h4>
 | ||
|     <p class="topless"><a href="mac.html"
 | ||
|                           title="next chapter"><span class="section-number">5. </span>Using Python on macOS</a></p>
 | ||
|   </div>
 | ||
|   <div role="note" aria-label="source link">
 | ||
|     <h3>This Page</h3>
 | ||
|     <ul class="this-page-menu">
 | ||
|       <li><a href="../bugs.html">Report a Bug</a></li>
 | ||
|       <li>
 | ||
|         <a href="https://github.com/python/cpython/blob/main/Doc/using/windows.rst"
 | ||
|             rel="nofollow">Show Source
 | ||
|         </a>
 | ||
|       </li>
 | ||
|     </ul>
 | ||
|   </div>
 | ||
|         </nav>
 | ||
|     </div>
 | ||
| </div>
 | ||
| 
 | ||
|   
 | ||
|     <div class="related" role="navigation" aria-label="Related">
 | ||
|       <h3>Navigation</h3>
 | ||
|       <ul>
 | ||
|         <li class="right" style="margin-right: 10px">
 | ||
|           <a href="../genindex.html" title="General Index"
 | ||
|              accesskey="I">index</a></li>
 | ||
|         <li class="right" >
 | ||
|           <a href="../py-modindex.html" title="Python Module Index"
 | ||
|              >modules</a> |</li>
 | ||
|         <li class="right" >
 | ||
|           <a href="mac.html" title="5. Using Python on macOS"
 | ||
|              accesskey="N">next</a> |</li>
 | ||
|         <li class="right" >
 | ||
|           <a href="configure.html" title="3. Configure Python"
 | ||
|              accesskey="P">previous</a> |</li>
 | ||
| 
 | ||
|           <li><img src="../_static/py.svg" alt="Python logo" style="vertical-align: middle; margin-top: -1px"/></li>
 | ||
|           <li><a href="https://www.python.org/">Python</a> »</li>
 | ||
|           <li class="switchers">
 | ||
|             <div class="language_switcher_placeholder"></div>
 | ||
|             <div class="version_switcher_placeholder"></div>
 | ||
|           </li>
 | ||
|           <li>
 | ||
|               
 | ||
|           </li>
 | ||
|     <li id="cpython-language-and-version">
 | ||
|       <a href="../index.html">3.13.3 Documentation</a> »
 | ||
|     </li>
 | ||
| 
 | ||
|           <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Python Setup and Usage</a> »</li>
 | ||
|         <li class="nav-item nav-item-this"><a href=""><span class="section-number">4. </span>Using Python on Windows</a></li>
 | ||
|                 <li class="right">
 | ||
|                     
 | ||
| 
 | ||
|     <div class="inline-search" role="search">
 | ||
|         <form class="inline-search" action="../search.html" method="get">
 | ||
|           <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" id="search-box" />
 | ||
|           <input type="submit" value="Go" />
 | ||
|         </form>
 | ||
|     </div>
 | ||
|                      |
 | ||
|                 </li>
 | ||
|             <li class="right">
 | ||
| <label class="theme-selector-label">
 | ||
|     Theme
 | ||
|     <select class="theme-selector" oninput="activateTheme(this.value)">
 | ||
|         <option value="auto" selected>Auto</option>
 | ||
|         <option value="light">Light</option>
 | ||
|         <option value="dark">Dark</option>
 | ||
|     </select>
 | ||
| </label> |</li>
 | ||
|             
 | ||
|       </ul>
 | ||
|     </div>    
 | ||
| 
 | ||
|     <div class="document">
 | ||
|       <div class="documentwrapper">
 | ||
|         <div class="bodywrapper">
 | ||
|           <div class="body" role="main">
 | ||
|             
 | ||
|   <section id="using-python-on-windows">
 | ||
| <span id="using-on-windows"></span><h1><span class="section-number">4. </span>Using Python on Windows<a class="headerlink" href="#using-python-on-windows" title="Link to this heading">¶</a></h1>
 | ||
| <p>This document aims to give an overview of Windows-specific behaviour you should
 | ||
| know about when using Python on Microsoft Windows.</p>
 | ||
| <p>Unlike most Unix systems and services, Windows does not include a system
 | ||
| supported installation of Python. To make Python available, the CPython team
 | ||
| has compiled Windows installers with every <a class="reference external" href="https://www.python.org/downloads/">release</a> for many years. These installers
 | ||
| are primarily intended to add a per-user installation of Python, with the
 | ||
| core interpreter and library being used by a single user. The installer is also
 | ||
| able to install for all users of a single machine, and a separate ZIP file is
 | ||
| available for application-local distributions.</p>
 | ||
| <p>As specified in <span class="target" id="index-0"></span><a class="pep reference external" href="https://peps.python.org/pep-0011/"><strong>PEP 11</strong></a>, a Python release only supports a Windows platform
 | ||
| while Microsoft considers the platform under extended support. This means that
 | ||
| Python 3.13 supports Windows 8.1 and newer. If you require Windows 7
 | ||
| support, please install Python 3.8.</p>
 | ||
| <p>There are a number of different installers available for Windows, each with
 | ||
| certain benefits and downsides.</p>
 | ||
| <p><a class="reference internal" href="#windows-full"><span class="std std-ref">The full installer</span></a> contains all components and is the best option for
 | ||
| developers using Python for any kind of project.</p>
 | ||
| <p><a class="reference internal" href="#windows-store"><span class="std std-ref">The Microsoft Store package</span></a> is a simple installation of Python that is suitable for
 | ||
| running scripts and packages, and using IDLE or other development environments.
 | ||
| It requires Windows 10 and above, but can be safely installed without corrupting other
 | ||
| programs. It also provides many convenient commands for launching Python and
 | ||
| its tools.</p>
 | ||
| <p><a class="reference internal" href="#windows-nuget"><span class="std std-ref">The nuget.org packages</span></a> are lightweight installations intended for continuous
 | ||
| integration systems. It can be used to build Python packages or run scripts,
 | ||
| but is not updateable and has no user interface tools.</p>
 | ||
| <p><a class="reference internal" href="#windows-embeddable"><span class="std std-ref">The embeddable package</span></a> is a minimal package of Python suitable for
 | ||
| embedding into a larger application.</p>
 | ||
| <section id="the-full-installer">
 | ||
| <span id="windows-full"></span><h2><span class="section-number">4.1. </span>The full installer<a class="headerlink" href="#the-full-installer" title="Link to this heading">¶</a></h2>
 | ||
| <section id="installation-steps">
 | ||
| <h3><span class="section-number">4.1.1. </span>Installation steps<a class="headerlink" href="#installation-steps" title="Link to this heading">¶</a></h3>
 | ||
| <p>Four Python 3.13 installers are available for download - two each for the
 | ||
| 32-bit and 64-bit versions of the interpreter. The <em>web installer</em> is a small
 | ||
| initial download, and it will automatically download the required components as
 | ||
| necessary. The <em>offline installer</em> includes the components necessary for a
 | ||
| default installation and only requires an internet connection for optional
 | ||
| features. See <a class="reference internal" href="#install-layout-option"><span class="std std-ref">Installing Without Downloading</span></a> for other ways to avoid downloading
 | ||
| during installation.</p>
 | ||
| <p>After starting the installer, one of two options may be selected:</p>
 | ||
| <img alt="../_images/win_installer.png" src="../_images/win_installer.png" />
 | ||
| <p>If you select “Install Now”:</p>
 | ||
| <ul class="simple">
 | ||
| <li><p>You will <em>not</em> need to be an administrator (unless a system update for the
 | ||
| C Runtime Library is required or you install the <a class="reference internal" href="#launcher"><span class="std std-ref">Python Launcher for Windows</span></a> for all
 | ||
| users)</p></li>
 | ||
| <li><p>Python will be installed into your user directory</p></li>
 | ||
| <li><p>The <a class="reference internal" href="#launcher"><span class="std std-ref">Python Launcher for Windows</span></a> will be installed according to the option at the bottom
 | ||
| of the first page</p></li>
 | ||
| <li><p>The standard library, test suite, launcher and pip will be installed</p></li>
 | ||
| <li><p>If selected, the install directory will be added to your <span class="target" id="index-1"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PATH</span></code></p></li>
 | ||
| <li><p>Shortcuts will only be visible for the current user</p></li>
 | ||
| </ul>
 | ||
| <p>Selecting “Customize installation” will allow you to select the features to
 | ||
| install, the installation location and other options or post-install actions.
 | ||
| To install debugging symbols or binaries, you will need to use this option.</p>
 | ||
| <p>To perform an all-users installation, you should select “Customize
 | ||
| installation”. In this case:</p>
 | ||
| <ul class="simple">
 | ||
| <li><p>You may be required to provide administrative credentials or approval</p></li>
 | ||
| <li><p>Python will be installed into the Program Files directory</p></li>
 | ||
| <li><p>The <a class="reference internal" href="#launcher"><span class="std std-ref">Python Launcher for Windows</span></a> will be installed into the Windows directory</p></li>
 | ||
| <li><p>Optional features may be selected during installation</p></li>
 | ||
| <li><p>The standard library can be pre-compiled to bytecode</p></li>
 | ||
| <li><p>If selected, the install directory will be added to the system <span class="target" id="index-2"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PATH</span></code></p></li>
 | ||
| <li><p>Shortcuts are available for all users</p></li>
 | ||
| </ul>
 | ||
| </section>
 | ||
| <section id="removing-the-max-path-limitation">
 | ||
| <span id="max-path"></span><h3><span class="section-number">4.1.2. </span>Removing the MAX_PATH Limitation<a class="headerlink" href="#removing-the-max-path-limitation" title="Link to this heading">¶</a></h3>
 | ||
| <p>Windows historically has limited path lengths to 260 characters. This meant that
 | ||
| paths longer than this would not resolve and errors would result.</p>
 | ||
| <p>In the latest versions of Windows, this limitation can be expanded to
 | ||
| approximately 32,000 characters. Your administrator will need to activate the
 | ||
| “Enable Win32 long paths” group policy, or set <code class="docutils literal notranslate"><span class="pre">LongPathsEnabled</span></code> to <code class="docutils literal notranslate"><span class="pre">1</span></code>
 | ||
| in the registry key
 | ||
| <code class="docutils literal notranslate"><span class="pre">HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem</span></code>.</p>
 | ||
| <p>This allows the <a class="reference internal" href="../library/functions.html#open" title="open"><code class="xref py py-func docutils literal notranslate"><span class="pre">open()</span></code></a> function, the <a class="reference internal" href="../library/os.html#module-os" title="os: Miscellaneous operating system interfaces."><code class="xref py py-mod docutils literal notranslate"><span class="pre">os</span></code></a> module and most other
 | ||
| path functionality to accept and return paths longer than 260 characters.</p>
 | ||
| <p>After changing the above option, no further configuration is required.</p>
 | ||
| <div class="versionchanged">
 | ||
| <p><span class="versionmodified changed">Changed in version 3.6: </span>Support for long paths was enabled in Python.</p>
 | ||
| </div>
 | ||
| </section>
 | ||
| <section id="installing-without-ui">
 | ||
| <span id="install-quiet-option"></span><h3><span class="section-number">4.1.3. </span>Installing Without UI<a class="headerlink" href="#installing-without-ui" title="Link to this heading">¶</a></h3>
 | ||
| <p>All of the options available in the installer UI can also be specified from the
 | ||
| command line, allowing scripted installers to replicate an installation on many
 | ||
| machines without user interaction.  These options may also be set without
 | ||
| suppressing the UI in order to change some of the defaults.</p>
 | ||
| <p>The following options (found by executing the installer with <code class="docutils literal notranslate"><span class="pre">/?</span></code>) can be
 | ||
| passed into the installer:</p>
 | ||
| <table class="docutils align-default">
 | ||
| <thead>
 | ||
| <tr class="row-odd"><th class="head"><p>Name</p></th>
 | ||
| <th class="head"><p>Description</p></th>
 | ||
| </tr>
 | ||
| </thead>
 | ||
| <tbody>
 | ||
| <tr class="row-even"><td><p>/passive</p></td>
 | ||
| <td><p>to display progress without requiring user interaction</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-odd"><td><p>/quiet</p></td>
 | ||
| <td><p>to install/uninstall without displaying any UI</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-even"><td><p>/simple</p></td>
 | ||
| <td><p>to prevent user customization</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-odd"><td><p>/uninstall</p></td>
 | ||
| <td><p>to remove Python (without confirmation)</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-even"><td><p>/layout [directory]</p></td>
 | ||
| <td><p>to pre-download all components</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-odd"><td><p>/log [filename]</p></td>
 | ||
| <td><p>to specify log files location</p></td>
 | ||
| </tr>
 | ||
| </tbody>
 | ||
| </table>
 | ||
| <p>All other options are passed as <code class="docutils literal notranslate"><span class="pre">name=value</span></code>, where the value is usually
 | ||
| <code class="docutils literal notranslate"><span class="pre">0</span></code> to disable a feature, <code class="docutils literal notranslate"><span class="pre">1</span></code> to enable a feature, or a path. The full list
 | ||
| of available options is shown below.</p>
 | ||
| <table class="docutils align-default">
 | ||
| <thead>
 | ||
| <tr class="row-odd"><th class="head"><p>Name</p></th>
 | ||
| <th class="head"><p>Description</p></th>
 | ||
| <th class="head"><p>Default</p></th>
 | ||
| </tr>
 | ||
| </thead>
 | ||
| <tbody>
 | ||
| <tr class="row-even"><td><p>InstallAllUsers</p></td>
 | ||
| <td><p>Perform a system-wide installation.</p></td>
 | ||
| <td><p>0</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-odd"><td><p>TargetDir</p></td>
 | ||
| <td><p>The installation directory</p></td>
 | ||
| <td><p>Selected based on
 | ||
| InstallAllUsers</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-even"><td><p>DefaultAllUsersTargetDir</p></td>
 | ||
| <td><p>The default installation directory
 | ||
| for all-user installs</p></td>
 | ||
| <td><p><code class="file docutils literal notranslate"><span class="pre">%ProgramFiles%\Python</span> <span class="pre">X.Y</span></code> or <code class="file docutils literal notranslate"><span class="pre">%ProgramFiles(x86)%\Python</span> <span class="pre">X.Y</span></code></p></td>
 | ||
| </tr>
 | ||
| <tr class="row-odd"><td><p>DefaultJustForMeTargetDir</p></td>
 | ||
| <td><p>The default install directory for
 | ||
| just-for-me installs</p></td>
 | ||
| <td><p><code class="file docutils literal notranslate"><span class="pre">%LocalAppData%\Programs\Python\PythonXY</span></code> or
 | ||
| <code class="file docutils literal notranslate"><span class="pre">%LocalAppData%\Programs\Python\PythonXY-32</span></code> or
 | ||
| <code class="file docutils literal notranslate"><span class="pre">%LocalAppData%\Programs\Python\PythonXY-64</span></code></p></td>
 | ||
| </tr>
 | ||
| <tr class="row-even"><td><p>DefaultCustomTargetDir</p></td>
 | ||
| <td><p>The default custom install directory
 | ||
| displayed in the UI</p></td>
 | ||
| <td><p>(empty)</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-odd"><td><p>AssociateFiles</p></td>
 | ||
| <td><p>Create file associations if the
 | ||
| launcher is also installed.</p></td>
 | ||
| <td><p>1</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-even"><td><p>CompileAll</p></td>
 | ||
| <td><p>Compile all <code class="docutils literal notranslate"><span class="pre">.py</span></code> files to
 | ||
| <code class="docutils literal notranslate"><span class="pre">.pyc</span></code>.</p></td>
 | ||
| <td><p>0</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-odd"><td><p>PrependPath</p></td>
 | ||
| <td><p>Prepend install and Scripts
 | ||
| directories  to <span class="target" id="index-3"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PATH</span></code> and
 | ||
| add <code class="docutils literal notranslate"><span class="pre">.PY</span></code> to <span class="target" id="index-4"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PATHEXT</span></code></p></td>
 | ||
| <td><p>0</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-even"><td><p>AppendPath</p></td>
 | ||
| <td><p>Append install and Scripts
 | ||
| directories  to <span class="target" id="index-5"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PATH</span></code> and
 | ||
| add <code class="docutils literal notranslate"><span class="pre">.PY</span></code> to <span class="target" id="index-6"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PATHEXT</span></code></p></td>
 | ||
| <td><p>0</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-odd"><td><p>Shortcuts</p></td>
 | ||
| <td><p>Create shortcuts for the interpreter,
 | ||
| documentation and IDLE if installed.</p></td>
 | ||
| <td><p>1</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-even"><td><p>Include_doc</p></td>
 | ||
| <td><p>Install Python manual</p></td>
 | ||
| <td><p>1</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-odd"><td><p>Include_debug</p></td>
 | ||
| <td><p>Install debug binaries</p></td>
 | ||
| <td><p>0</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-even"><td><p>Include_dev</p></td>
 | ||
| <td><p>Install developer headers and
 | ||
| libraries. Omitting this may lead to
 | ||
| an unusable installation.</p></td>
 | ||
| <td><p>1</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-odd"><td><p>Include_exe</p></td>
 | ||
| <td><p>Install <code class="file docutils literal notranslate"><span class="pre">python.exe</span></code> and
 | ||
| related files. Omitting this may
 | ||
| lead to an unusable installation.</p></td>
 | ||
| <td><p>1</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-even"><td><p>Include_launcher</p></td>
 | ||
| <td><p>Install <a class="reference internal" href="#launcher"><span class="std std-ref">Python Launcher for Windows</span></a>.</p></td>
 | ||
| <td><p>1</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-odd"><td><p>InstallLauncherAllUsers</p></td>
 | ||
| <td><p>Installs the launcher for all
 | ||
| users. Also requires
 | ||
| <code class="docutils literal notranslate"><span class="pre">Include_launcher</span></code> to be set to 1</p></td>
 | ||
| <td><p>1</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-even"><td><p>Include_lib</p></td>
 | ||
| <td><p>Install standard library and
 | ||
| extension modules. Omitting this may
 | ||
| lead to an unusable installation.</p></td>
 | ||
| <td><p>1</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-odd"><td><p>Include_pip</p></td>
 | ||
| <td><p>Install bundled pip and setuptools</p></td>
 | ||
| <td><p>1</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-even"><td><p>Include_symbols</p></td>
 | ||
| <td><p>Install debugging symbols (<code class="docutils literal notranslate"><span class="pre">*.pdb</span></code>)</p></td>
 | ||
| <td><p>0</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-odd"><td><p>Include_tcltk</p></td>
 | ||
| <td><p>Install Tcl/Tk support and IDLE</p></td>
 | ||
| <td><p>1</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-even"><td><p>Include_test</p></td>
 | ||
| <td><p>Install standard library test suite</p></td>
 | ||
| <td><p>1</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-odd"><td><p>Include_tools</p></td>
 | ||
| <td><p>Install utility scripts</p></td>
 | ||
| <td><p>1</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-even"><td><p>LauncherOnly</p></td>
 | ||
| <td><p>Only installs the launcher. This
 | ||
| will override most other options.</p></td>
 | ||
| <td><p>0</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-odd"><td><p>SimpleInstall</p></td>
 | ||
| <td><p>Disable most install UI</p></td>
 | ||
| <td><p>0</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-even"><td><p>SimpleInstallDescription</p></td>
 | ||
| <td><p>A custom message to display when the
 | ||
| simplified install UI is used.</p></td>
 | ||
| <td><p>(empty)</p></td>
 | ||
| </tr>
 | ||
| </tbody>
 | ||
| </table>
 | ||
| <p>For example, to silently install a default, system-wide Python installation,
 | ||
| you could use the following command (from an elevated command prompt):</p>
 | ||
| <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python-3.9.0.exe /quiet InstallAllUsers=1 PrependPath=1 Include_test=0
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| <p>To allow users to easily install a personal copy of Python without the test
 | ||
| suite, you could provide a shortcut with the following command. This will
 | ||
| display a simplified initial page and disallow customization:</p>
 | ||
| <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python-3.9.0.exe InstallAllUsers=0 Include_launcher=0 Include_test=0
 | ||
|     SimpleInstall=1 SimpleInstallDescription="Just for me, no test suite."
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| <p>(Note that omitting the launcher also omits file associations, and is only
 | ||
| recommended for per-user installs when there is also a system-wide installation
 | ||
| that included the launcher.)</p>
 | ||
| <p>The options listed above can also be provided in a file named <code class="docutils literal notranslate"><span class="pre">unattend.xml</span></code>
 | ||
| alongside the executable. This file specifies a list of options and values.
 | ||
| When a value is provided as an attribute, it will be converted to a number if
 | ||
| possible. Values provided as element text are always left as strings. This
 | ||
| example file sets the same options as the previous example:</p>
 | ||
| <div class="highlight-xml notranslate"><div class="highlight"><pre><span></span><span class="nt"><Options></span>
 | ||
| <span class="w">    </span><span class="nt"><Option</span><span class="w"> </span><span class="na">Name=</span><span class="s">"InstallAllUsers"</span><span class="w"> </span><span class="na">Value=</span><span class="s">"no"</span><span class="w"> </span><span class="nt">/></span>
 | ||
| <span class="w">    </span><span class="nt"><Option</span><span class="w"> </span><span class="na">Name=</span><span class="s">"Include_launcher"</span><span class="w"> </span><span class="na">Value=</span><span class="s">"0"</span><span class="w"> </span><span class="nt">/></span>
 | ||
| <span class="w">    </span><span class="nt"><Option</span><span class="w"> </span><span class="na">Name=</span><span class="s">"Include_test"</span><span class="w"> </span><span class="na">Value=</span><span class="s">"no"</span><span class="w"> </span><span class="nt">/></span>
 | ||
| <span class="w">    </span><span class="nt"><Option</span><span class="w"> </span><span class="na">Name=</span><span class="s">"SimpleInstall"</span><span class="w"> </span><span class="na">Value=</span><span class="s">"yes"</span><span class="w"> </span><span class="nt">/></span>
 | ||
| <span class="w">    </span><span class="nt"><Option</span><span class="w"> </span><span class="na">Name=</span><span class="s">"SimpleInstallDescription"</span><span class="nt">></span>Just<span class="w"> </span>for<span class="w"> </span>me,<span class="w"> </span>no<span class="w"> </span>test<span class="w"> </span>suite<span class="nt"></Option></span>
 | ||
| <span class="nt"></Options></span>
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| </section>
 | ||
| <section id="installing-without-downloading">
 | ||
| <span id="install-layout-option"></span><h3><span class="section-number">4.1.4. </span>Installing Without Downloading<a class="headerlink" href="#installing-without-downloading" title="Link to this heading">¶</a></h3>
 | ||
| <p>As some features of Python are not included in the initial installer download,
 | ||
| selecting those features may require an internet connection.  To avoid this
 | ||
| need, all possible components may be downloaded on-demand to create a complete
 | ||
| <em>layout</em> that will no longer require an internet connection regardless of the
 | ||
| selected features. Note that this download may be bigger than required, but
 | ||
| where a large number of installations are going to be performed it is very
 | ||
| useful to have a locally cached copy.</p>
 | ||
| <p>Execute the following command from Command Prompt to download all possible
 | ||
| required files.  Remember to substitute <code class="docutils literal notranslate"><span class="pre">python-3.9.0.exe</span></code> for the actual
 | ||
| name of your installer, and to create layouts in their own directories to
 | ||
| avoid collisions between files with the same name.</p>
 | ||
| <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>python-3.9.0.exe /layout [optional target directory]
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| <p>You may also specify the <code class="docutils literal notranslate"><span class="pre">/quiet</span></code> option to hide the progress display.</p>
 | ||
| </section>
 | ||
| <section id="modifying-an-install">
 | ||
| <h3><span class="section-number">4.1.5. </span>Modifying an install<a class="headerlink" href="#modifying-an-install" title="Link to this heading">¶</a></h3>
 | ||
| <p>Once Python has been installed, you can add or remove features through the
 | ||
| Programs and Features tool that is part of Windows. Select the Python entry and
 | ||
| choose “Uninstall/Change” to open the installer in maintenance mode.</p>
 | ||
| <p>“Modify” allows you to add or remove features by modifying the checkboxes -
 | ||
| unchanged checkboxes will not install or remove anything. Some options cannot be
 | ||
| changed in this mode, such as the install directory; to modify these, you will
 | ||
| need to remove and then reinstall Python completely.</p>
 | ||
| <p>“Repair” will verify all the files that should be installed using the current
 | ||
| settings and replace any that have been removed or modified.</p>
 | ||
| <p>“Uninstall” will remove Python entirely, with the exception of the
 | ||
| <a class="reference internal" href="#launcher"><span class="std std-ref">Python Launcher for Windows</span></a>, which has its own entry in Programs and Features.</p>
 | ||
| </section>
 | ||
| <section id="installing-free-threaded-binaries">
 | ||
| <span id="install-freethreaded-windows"></span><h3><span class="section-number">4.1.6. </span>Installing Free-threaded Binaries<a class="headerlink" href="#installing-free-threaded-binaries" title="Link to this heading">¶</a></h3>
 | ||
| <div class="versionadded">
 | ||
| <p><span class="versionmodified added">Added in version 3.13: </span>(Experimental)</p>
 | ||
| </div>
 | ||
| <div class="admonition note">
 | ||
| <p class="admonition-title">Note</p>
 | ||
| <p>Everything described in this section is considered experimental,
 | ||
| and should be expected to change in future releases.</p>
 | ||
| </div>
 | ||
| <p>To install pre-built binaries with free-threading enabled (see <span class="target" id="index-7"></span><a class="pep reference external" href="https://peps.python.org/pep-0703/"><strong>PEP 703</strong></a>), you
 | ||
| should select “Customize installation”. The second page of options includes the
 | ||
| “Download free-threaded binaries” checkbox.</p>
 | ||
| <img alt="../_images/win_install_freethreaded.png" src="../_images/win_install_freethreaded.png" />
 | ||
| <p>Selecting this option will download and install additional binaries to the same
 | ||
| location as the main Python install. The main executable is called
 | ||
| <code class="docutils literal notranslate"><span class="pre">python3.13t.exe</span></code>, and other binaries either receive a <code class="docutils literal notranslate"><span class="pre">t</span></code> suffix or a full
 | ||
| ABI suffix. Python source files and bundled third-party dependencies are shared
 | ||
| with the main install.</p>
 | ||
| <p>The free-threaded version is registered as a regular Python install with the
 | ||
| tag <code class="docutils literal notranslate"><span class="pre">3.13t</span></code> (with a <code class="docutils literal notranslate"><span class="pre">-32</span></code> or <code class="docutils literal notranslate"><span class="pre">-arm64</span></code> suffix as normal for those
 | ||
| platforms). This allows tools to discover it, and for the <a class="reference internal" href="#launcher"><span class="std std-ref">Python Launcher for Windows</span></a> to
 | ||
| support <code class="docutils literal notranslate"><span class="pre">py.exe</span> <span class="pre">-3.13t</span></code>. Note that the launcher will interpret <code class="docutils literal notranslate"><span class="pre">py.exe</span> <span class="pre">-3</span></code>
 | ||
| (or a <code class="docutils literal notranslate"><span class="pre">python3</span></code> shebang) as “the latest 3.x install”, which will prefer the
 | ||
| free-threaded binaries over the regular ones, while <code class="docutils literal notranslate"><span class="pre">py.exe</span> <span class="pre">-3.13</span></code> will not.
 | ||
| If you use the short style of option, you may prefer to not install the
 | ||
| free-threaded binaries at this time.</p>
 | ||
| <p>To specify the install option at the command line, use
 | ||
| <code class="docutils literal notranslate"><span class="pre">Include_freethreaded=1</span></code>. See <a class="reference internal" href="#install-layout-option"><span class="std std-ref">Installing Without Downloading</span></a> for instructions on
 | ||
| pre-emptively downloading the additional binaries for offline install. The
 | ||
| options to include debug symbols and binaries also apply to the free-threaded
 | ||
| builds.</p>
 | ||
| <p>Free-threaded binaries are also available <a class="reference internal" href="#windows-nuget"><span class="std std-ref">on nuget.org</span></a>.</p>
 | ||
| </section>
 | ||
| </section>
 | ||
| <section id="the-microsoft-store-package">
 | ||
| <span id="windows-store"></span><h2><span class="section-number">4.2. </span>The Microsoft Store package<a class="headerlink" href="#the-microsoft-store-package" title="Link to this heading">¶</a></h2>
 | ||
| <div class="versionadded">
 | ||
| <p><span class="versionmodified added">Added in version 3.7.2.</span></p>
 | ||
| </div>
 | ||
| <p>The Microsoft Store package is an easily installable Python interpreter that
 | ||
| is intended mainly for interactive use, for example, by students.</p>
 | ||
| <p>To install the package, ensure you have the latest Windows 10 updates and
 | ||
| search the Microsoft Store app for “Python 3.13”. Ensure that the app
 | ||
| you select is published by the Python Software Foundation, and install it.</p>
 | ||
| <div class="admonition warning">
 | ||
| <p class="admonition-title">Warning</p>
 | ||
| <p>Python will always be available for free on the Microsoft Store. If you
 | ||
| are asked to pay for it, you have not selected the correct package.</p>
 | ||
| </div>
 | ||
| <p>After installation, Python may be launched by finding it in Start.
 | ||
| Alternatively, it will be available from any Command Prompt or PowerShell
 | ||
| session by typing <code class="docutils literal notranslate"><span class="pre">python</span></code>. Further, pip and IDLE may be used by typing
 | ||
| <code class="docutils literal notranslate"><span class="pre">pip</span></code> or <code class="docutils literal notranslate"><span class="pre">idle</span></code>. IDLE can also be found in Start.</p>
 | ||
| <p>All three commands are also available with version number suffixes, for
 | ||
| example, as <code class="docutils literal notranslate"><span class="pre">python3.exe</span></code> and <code class="docutils literal notranslate"><span class="pre">python3.x.exe</span></code> as well as
 | ||
| <code class="docutils literal notranslate"><span class="pre">python.exe</span></code> (where <code class="docutils literal notranslate"><span class="pre">3.x</span></code> is the specific version you want to launch,
 | ||
| such as 3.13). Open “Manage App Execution Aliases” through Start to
 | ||
| select which version of Python is associated with each command. It is
 | ||
| recommended to make sure that <code class="docutils literal notranslate"><span class="pre">pip</span></code> and <code class="docutils literal notranslate"><span class="pre">idle</span></code> are consistent with
 | ||
| whichever version of <code class="docutils literal notranslate"><span class="pre">python</span></code> is selected.</p>
 | ||
| <p>Virtual environments can be created with <code class="docutils literal notranslate"><span class="pre">python</span> <span class="pre">-m</span> <span class="pre">venv</span></code> and activated
 | ||
| and used as normal.</p>
 | ||
| <p>If you have installed another version of Python and added it to your
 | ||
| <code class="docutils literal notranslate"><span class="pre">PATH</span></code> variable, it will be available as <code class="docutils literal notranslate"><span class="pre">python.exe</span></code> rather than the
 | ||
| one from the Microsoft Store. To access the new installation, use
 | ||
| <code class="docutils literal notranslate"><span class="pre">python3.exe</span></code> or <code class="docutils literal notranslate"><span class="pre">python3.x.exe</span></code>.</p>
 | ||
| <p>The <code class="docutils literal notranslate"><span class="pre">py.exe</span></code> launcher will detect this Python installation, but will prefer
 | ||
| installations from the traditional installer.</p>
 | ||
| <p>To remove Python, open Settings and use Apps and Features, or else find
 | ||
| Python in Start and right-click to select Uninstall. Uninstalling will
 | ||
| remove all packages you installed directly into this Python installation, but
 | ||
| will not remove any virtual environments</p>
 | ||
| <section id="known-issues">
 | ||
| <h3><span class="section-number">4.2.1. </span>Known issues<a class="headerlink" href="#known-issues" title="Link to this heading">¶</a></h3>
 | ||
| <section id="redirection-of-local-data-registry-and-temporary-paths">
 | ||
| <h4><span class="section-number">4.2.1.1. </span>Redirection of local data, registry, and temporary paths<a class="headerlink" href="#redirection-of-local-data-registry-and-temporary-paths" title="Link to this heading">¶</a></h4>
 | ||
| <p>Because of restrictions on Microsoft Store apps, Python scripts may not have
 | ||
| full write access to shared locations such as <span class="target" id="index-8"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">TEMP</span></code> and the registry.
 | ||
| Instead, it will write to a private copy. If your scripts must modify the
 | ||
| shared locations, you will need to install the full installer.</p>
 | ||
| <p>At runtime, Python will use a private copy of well-known Windows folders and the registry.
 | ||
| For example, if the environment variable <span class="target" id="index-9"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">%APPDATA%</span></code> is <code class="file docutils literal notranslate"><span class="pre">c:\Users\<user>\AppData\</span></code>,
 | ||
| then when writing to <code class="file docutils literal notranslate"><span class="pre">C:\Users\<user>\AppData\Local</span></code> will write to
 | ||
| <code class="file docutils literal notranslate"><span class="pre">C:\Users\<user>\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\Local\</span></code>.</p>
 | ||
| <p>When reading files, Windows will return the file from the private folder, or if that does not exist, the
 | ||
| real Windows directory. For example reading <code class="file docutils literal notranslate"><span class="pre">C:\Windows\System32</span></code> returns the contents of <code class="file docutils literal notranslate"><span class="pre">C:\Windows\System32</span></code>
 | ||
| plus the contents of <code class="file docutils literal notranslate"><span class="pre">C:\Program</span> <span class="pre">Files\WindowsApps\package_name\VFS\SystemX86</span></code>.</p>
 | ||
| <p>You can find the real path of any existing file using <a class="reference internal" href="../library/os.path.html#os.path.realpath" title="os.path.realpath"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.path.realpath()</span></code></a>:</p>
 | ||
| <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
 | ||
| <span class="gp">>>> </span><span class="n">test_file</span> <span class="o">=</span> <span class="s1">'C:</span><span class="se">\\</span><span class="s1">Users</span><span class="se">\\</span><span class="s1">example</span><span class="se">\\</span><span class="s1">AppData</span><span class="se">\\</span><span class="s1">Local</span><span class="se">\\</span><span class="s1">test.txt'</span>
 | ||
| <span class="gp">>>> </span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">realpath</span><span class="p">(</span><span class="n">test_file</span><span class="p">)</span>
 | ||
| <span class="go">'C:\\Users\\example\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\\LocalCache\\Local\\test.txt'</span>
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| <p>When writing to the Windows Registry, the following behaviors exist:</p>
 | ||
| <ul class="simple">
 | ||
| <li><p>Reading from <code class="docutils literal notranslate"><span class="pre">HKLM\\Software</span></code> is allowed and results are merged with the <code class="file docutils literal notranslate"><span class="pre">registry.dat</span></code> file in the package.</p></li>
 | ||
| <li><p>Writing to <code class="docutils literal notranslate"><span class="pre">HKLM\\Software</span></code> is not allowed if the corresponding key/value exists, i.e. modifying existing keys.</p></li>
 | ||
| <li><p>Writing to <code class="docutils literal notranslate"><span class="pre">HKLM\\Software</span></code> is allowed as long as a corresponding key/value does not exist in the package
 | ||
| and the user has the correct access permissions.</p></li>
 | ||
| </ul>
 | ||
| <p>For more detail on the technical basis for these limitations, please consult
 | ||
| Microsoft’s documentation on packaged full-trust apps, currently available at
 | ||
| <a class="reference external" href="https://learn.microsoft.com/windows/msix/desktop/desktop-to-uwp-behind-the-scenes">docs.microsoft.com/en-us/windows/msix/desktop/desktop-to-uwp-behind-the-scenes</a></p>
 | ||
| </section>
 | ||
| </section>
 | ||
| </section>
 | ||
| <section id="the-nuget-org-packages">
 | ||
| <span id="windows-nuget"></span><h2><span class="section-number">4.3. </span>The nuget.org packages<a class="headerlink" href="#the-nuget-org-packages" title="Link to this heading">¶</a></h2>
 | ||
| <div class="versionadded">
 | ||
| <p><span class="versionmodified added">Added in version 3.5.2.</span></p>
 | ||
| </div>
 | ||
| <p>The nuget.org package is a reduced size Python environment intended for use on
 | ||
| continuous integration and build systems that do not have a system-wide
 | ||
| install of Python. While nuget is “the package manager for .NET”, it also works
 | ||
| perfectly fine for packages containing build-time tools.</p>
 | ||
| <p>Visit <a class="reference external" href="https://www.nuget.org/">nuget.org</a> for the most up-to-date information
 | ||
| on using nuget. What follows is a summary that is sufficient for Python
 | ||
| developers.</p>
 | ||
| <p>The <code class="docutils literal notranslate"><span class="pre">nuget.exe</span></code> command line tool may be downloaded directly from
 | ||
| <code class="docutils literal notranslate"><span class="pre">https://aka.ms/nugetclidl</span></code>, for example, using curl or PowerShell. With the
 | ||
| tool, the latest version of Python for 64-bit or 32-bit machines is installed
 | ||
| using:</p>
 | ||
| <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>nuget.exe install python -ExcludeVersion -OutputDirectory .
 | ||
| nuget.exe install pythonx86 -ExcludeVersion -OutputDirectory .
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| <p>To select a particular version, add a <code class="docutils literal notranslate"><span class="pre">-Version</span> <span class="pre">3.x.y</span></code>. The output directory
 | ||
| may be changed from <code class="docutils literal notranslate"><span class="pre">.</span></code>, and the package will be installed into a
 | ||
| subdirectory. By default, the subdirectory is named the same as the package,
 | ||
| and without the <code class="docutils literal notranslate"><span class="pre">-ExcludeVersion</span></code> option this name will include the specific
 | ||
| version installed. Inside the subdirectory is a <code class="docutils literal notranslate"><span class="pre">tools</span></code> directory that
 | ||
| contains the Python installation:</p>
 | ||
| <div class="highlight-doscon notranslate"><div class="highlight"><pre><span></span><span class="go"># Without -ExcludeVersion</span>
 | ||
| <span class="gp">></span> .\python.3.5.2\tools\python.exe -V
 | ||
| <span class="go">Python 3.5.2</span>
 | ||
| 
 | ||
| <span class="go"># With -ExcludeVersion</span>
 | ||
| <span class="gp">></span> .\python\tools\python.exe -V
 | ||
| <span class="go">Python 3.5.2</span>
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| <p>In general, nuget packages are not upgradeable, and newer versions should be
 | ||
| installed side-by-side and referenced using the full path. Alternatively,
 | ||
| delete the package directory manually and install it again. Many CI systems
 | ||
| will do this automatically if they do not preserve files between builds.</p>
 | ||
| <p>Alongside the <code class="docutils literal notranslate"><span class="pre">tools</span></code> directory is a <code class="docutils literal notranslate"><span class="pre">build\native</span></code> directory. This
 | ||
| contains a MSBuild properties file <code class="docutils literal notranslate"><span class="pre">python.props</span></code> that can be used in a
 | ||
| C++ project to reference the Python install. Including the settings will
 | ||
| automatically use the headers and import libraries in your build.</p>
 | ||
| <p>The package information pages on nuget.org are
 | ||
| <a class="reference external" href="https://www.nuget.org/packages/python">www.nuget.org/packages/python</a>
 | ||
| for the 64-bit version, <a class="reference external" href="https://www.nuget.org/packages/pythonx86">www.nuget.org/packages/pythonx86</a> for the 32-bit version, and
 | ||
| <a class="reference external" href="https://www.nuget.org/packages/pythonarm64">www.nuget.org/packages/pythonarm64</a> for the ARM64 version</p>
 | ||
| <section id="free-threaded-packages">
 | ||
| <h3><span class="section-number">4.3.1. </span>Free-threaded packages<a class="headerlink" href="#free-threaded-packages" title="Link to this heading">¶</a></h3>
 | ||
| <div class="versionadded">
 | ||
| <p><span class="versionmodified added">Added in version 3.13: </span>(Experimental)</p>
 | ||
| </div>
 | ||
| <div class="admonition note">
 | ||
| <p class="admonition-title">Note</p>
 | ||
| <p>Everything described in this section is considered experimental,
 | ||
| and should be expected to change in future releases.</p>
 | ||
| </div>
 | ||
| <p>Packages containing free-threaded binaries are named
 | ||
| <a class="reference external" href="https://www.nuget.org/packages/python-freethreaded">python-freethreaded</a>
 | ||
| for the 64-bit version, <a class="reference external" href="https://www.nuget.org/packages/pythonx86-freethreaded">pythonx86-freethreaded</a> for the 32-bit
 | ||
| version, and <a class="reference external" href="https://www.nuget.org/packages/pythonarm64-freethreaded">pythonarm64-freethreaded</a> for the ARM64
 | ||
| version. These packages contain both the <code class="docutils literal notranslate"><span class="pre">python3.13t.exe</span></code> and
 | ||
| <code class="docutils literal notranslate"><span class="pre">python.exe</span></code> entry points, both of which run free threaded.</p>
 | ||
| </section>
 | ||
| </section>
 | ||
| <section id="the-embeddable-package">
 | ||
| <span id="windows-embeddable"></span><h2><span class="section-number">4.4. </span>The embeddable package<a class="headerlink" href="#the-embeddable-package" title="Link to this heading">¶</a></h2>
 | ||
| <div class="versionadded">
 | ||
| <p><span class="versionmodified added">Added in version 3.5.</span></p>
 | ||
| </div>
 | ||
| <p>The embedded distribution is a ZIP file containing a minimal Python environment.
 | ||
| It is intended for acting as part of another application, rather than being
 | ||
| directly accessed by end-users.</p>
 | ||
| <p>When extracted, the embedded distribution is (almost) fully isolated from the
 | ||
| user’s system, including environment variables, system registry settings, and
 | ||
| installed packages. The standard library is included as pre-compiled and
 | ||
| optimized <code class="docutils literal notranslate"><span class="pre">.pyc</span></code> files in a ZIP, and <code class="docutils literal notranslate"><span class="pre">python3.dll</span></code>, <code class="docutils literal notranslate"><span class="pre">python37.dll</span></code>,
 | ||
| <code class="docutils literal notranslate"><span class="pre">python.exe</span></code> and <code class="docutils literal notranslate"><span class="pre">pythonw.exe</span></code> are all provided. Tcl/tk (including all
 | ||
| dependents, such as Idle), pip and the Python documentation are not included.</p>
 | ||
| <div class="admonition note">
 | ||
| <p class="admonition-title">Note</p>
 | ||
| <p>The embedded distribution does not include the <a class="reference external" href="https://learn.microsoft.com/cpp/windows/latest-supported-vc-redist#visual-studio-2015-2017-2019-and-2022">Microsoft C Runtime</a> and it is
 | ||
| the responsibility of the application installer to provide this. The
 | ||
| runtime may have already been installed on a user’s system previously or
 | ||
| automatically via Windows Update, and can be detected by finding
 | ||
| <code class="docutils literal notranslate"><span class="pre">ucrtbase.dll</span></code> in the system directory.</p>
 | ||
| </div>
 | ||
| <p>Third-party packages should be installed by the application installer alongside
 | ||
| the embedded distribution. Using pip to manage dependencies as for a regular
 | ||
| Python installation is not supported with this distribution, though with some
 | ||
| care it may be possible to include and use pip for automatic updates. In
 | ||
| general, third-party packages should be treated as part of the application
 | ||
| (“vendoring”) so that the developer can ensure compatibility with newer
 | ||
| versions before providing updates to users.</p>
 | ||
| <p>The two recommended use cases for this distribution are described below.</p>
 | ||
| <section id="python-application">
 | ||
| <h3><span class="section-number">4.4.1. </span>Python Application<a class="headerlink" href="#python-application" title="Link to this heading">¶</a></h3>
 | ||
| <p>An application written in Python does not necessarily require users to be aware
 | ||
| of that fact. The embedded distribution may be used in this case to include a
 | ||
| private version of Python in an install package. Depending on how transparent it
 | ||
| should be (or conversely, how professional it should appear), there are two
 | ||
| options.</p>
 | ||
| <p>Using a specialized executable as a launcher requires some coding, but provides
 | ||
| the most transparent experience for users. With a customized launcher, there are
 | ||
| no obvious indications that the program is running on Python: icons can be
 | ||
| customized, company and version information can be specified, and file
 | ||
| associations behave properly. In most cases, a custom launcher should simply be
 | ||
| able to call <code class="docutils literal notranslate"><span class="pre">Py_Main</span></code> with a hard-coded command line.</p>
 | ||
| <p>The simpler approach is to provide a batch file or generated shortcut that
 | ||
| directly calls the <code class="docutils literal notranslate"><span class="pre">python.exe</span></code> or <code class="docutils literal notranslate"><span class="pre">pythonw.exe</span></code> with the required
 | ||
| command-line arguments. In this case, the application will appear to be Python
 | ||
| and not its actual name, and users may have trouble distinguishing it from other
 | ||
| running Python processes or file associations.</p>
 | ||
| <p>With the latter approach, packages should be installed as directories alongside
 | ||
| the Python executable to ensure they are available on the path. With the
 | ||
| specialized launcher, packages can be located in other locations as there is an
 | ||
| opportunity to specify the search path before launching the application.</p>
 | ||
| </section>
 | ||
| <section id="embedding-python">
 | ||
| <h3><span class="section-number">4.4.2. </span>Embedding Python<a class="headerlink" href="#embedding-python" title="Link to this heading">¶</a></h3>
 | ||
| <p>Applications written in native code often require some form of scripting
 | ||
| language, and the embedded Python distribution can be used for this purpose. In
 | ||
| general, the majority of the application is in native code, and some part will
 | ||
| either invoke <code class="docutils literal notranslate"><span class="pre">python.exe</span></code> or directly use <code class="docutils literal notranslate"><span class="pre">python3.dll</span></code>. For either case,
 | ||
| extracting the embedded distribution to a subdirectory of the application
 | ||
| installation is sufficient to provide a loadable Python interpreter.</p>
 | ||
| <p>As with the application use, packages can be installed to any location as there
 | ||
| is an opportunity to specify search paths before initializing the interpreter.
 | ||
| Otherwise, there is no fundamental differences between using the embedded
 | ||
| distribution and a regular installation.</p>
 | ||
| </section>
 | ||
| </section>
 | ||
| <section id="alternative-bundles">
 | ||
| <h2><span class="section-number">4.5. </span>Alternative bundles<a class="headerlink" href="#alternative-bundles" title="Link to this heading">¶</a></h2>
 | ||
| <p>Besides the standard CPython distribution, there are modified packages including
 | ||
| additional functionality.  The following is a list of popular versions and their
 | ||
| key features:</p>
 | ||
| <dl>
 | ||
| <dt><a class="reference external" href="https://www.activestate.com/products/python/">ActivePython</a></dt><dd><p>Installer with multi-platform compatibility, documentation, PyWin32</p>
 | ||
| </dd>
 | ||
| <dt><a class="reference external" href="https://www.anaconda.com/download/">Anaconda</a></dt><dd><p>Popular scientific modules (such as numpy, scipy and pandas) and the
 | ||
| <code class="docutils literal notranslate"><span class="pre">conda</span></code> package manager.</p>
 | ||
| </dd>
 | ||
| <dt><a class="reference external" href="https://assets.enthought.com/downloads/edm/">Enthought Deployment Manager</a></dt><dd><p>“The Next Generation Python Environment and Package Manager”.</p>
 | ||
| <p>Previously Enthought provided Canopy, but it <a class="reference external" href="https://support.enthought.com/hc/en-us/articles/360038600051-Canopy-GUI-end-of-life-transition-to-the-Enthought-Deployment-Manager-EDM-and-Visual-Studio-Code">reached end of life in 2016</a>.</p>
 | ||
| </dd>
 | ||
| <dt><a class="reference external" href="https://winpython.github.io/">WinPython</a></dt><dd><p>Windows-specific distribution with prebuilt scientific packages and
 | ||
| tools for building packages.</p>
 | ||
| </dd>
 | ||
| </dl>
 | ||
| <p>Note that these packages may not include the latest versions of Python or
 | ||
| other libraries, and are not maintained or supported by the core Python team.</p>
 | ||
| </section>
 | ||
| <section id="configuring-python">
 | ||
| <h2><span class="section-number">4.6. </span>Configuring Python<a class="headerlink" href="#configuring-python" title="Link to this heading">¶</a></h2>
 | ||
| <p>To run Python conveniently from a command prompt, you might consider changing
 | ||
| some default environment variables in Windows.  While the installer provides an
 | ||
| option to configure the PATH and PATHEXT variables for you, this is only
 | ||
| reliable for a single, system-wide installation.  If you regularly use multiple
 | ||
| versions of Python, consider using the <a class="reference internal" href="#launcher"><span class="std std-ref">Python Launcher for Windows</span></a>.</p>
 | ||
| <section id="excursus-setting-environment-variables">
 | ||
| <span id="setting-envvars"></span><h3><span class="section-number">4.6.1. </span>Excursus: Setting environment variables<a class="headerlink" href="#excursus-setting-environment-variables" title="Link to this heading">¶</a></h3>
 | ||
| <p>Windows allows environment variables to be configured permanently at both the
 | ||
| User level and the System level, or temporarily in a command prompt.</p>
 | ||
| <p>To temporarily set environment variables, open Command Prompt and use the
 | ||
| <strong class="command">set</strong> command:</p>
 | ||
| <div class="highlight-doscon notranslate"><div class="highlight"><pre><span></span><span class="gp">C:\></span><span class="k">set</span> <span class="nv">PATH</span><span class="p">=</span>C:\Program Files\Python 3.9;<span class="nv">%PATH%</span>
 | ||
| <span class="gp">C:\></span><span class="k">set</span> <span class="nv">PYTHONPATH</span><span class="p">=</span><span class="nv">%PYTHONPATH%</span>;C:\My_python_lib
 | ||
| <span class="gp">C:\></span>python
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| <p>These changes will apply to any further commands executed in that console, and
 | ||
| will be inherited by any applications started from the console.</p>
 | ||
| <p>Including the variable name within percent signs will expand to the existing
 | ||
| value, allowing you to add your new value at either the start or the end.
 | ||
| Modifying <span class="target" id="index-10"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PATH</span></code> by adding the directory containing
 | ||
| <strong class="program">python.exe</strong> to the start is a common way to ensure the correct version
 | ||
| of Python is launched.</p>
 | ||
| <p>To permanently modify the default environment variables, click Start and search
 | ||
| for ‘edit environment variables’, or open System properties, <span class="guilabel">Advanced
 | ||
| system settings</span> and click the <span class="guilabel">Environment Variables</span> button.
 | ||
| In this dialog, you can add or modify User and System variables. To change
 | ||
| System variables, you need non-restricted access to your machine
 | ||
| (i.e. Administrator rights).</p>
 | ||
| <div class="admonition note">
 | ||
| <p class="admonition-title">Note</p>
 | ||
| <p>Windows will concatenate User variables <em>after</em> System variables, which may
 | ||
| cause unexpected results when modifying <span class="target" id="index-11"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PATH</span></code>.</p>
 | ||
| <p>The <span class="target" id="index-12"></span><a class="reference internal" href="cmdline.html#envvar-PYTHONPATH"><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PYTHONPATH</span></code></a> variable is used by all versions of Python,
 | ||
| so you should not permanently configure it unless the listed paths
 | ||
| only include code that is compatible with all of your installed Python
 | ||
| versions.</p>
 | ||
| </div>
 | ||
| <div class="admonition seealso">
 | ||
| <p class="admonition-title">See also</p>
 | ||
| <dl class="simple">
 | ||
| <dt><a class="reference external" href="https://learn.microsoft.com/windows/win32/procthread/environment-variables">https://learn.microsoft.com/windows/win32/procthread/environment-variables</a></dt><dd><p>Overview of environment variables on Windows</p>
 | ||
| </dd>
 | ||
| <dt><a class="reference external" href="https://learn.microsoft.com/windows-server/administration/windows-commands/set_1">https://learn.microsoft.com/windows-server/administration/windows-commands/set_1</a></dt><dd><p>The <code class="docutils literal notranslate"><span class="pre">set</span></code> command, for temporarily modifying environment variables</p>
 | ||
| </dd>
 | ||
| <dt><a class="reference external" href="https://learn.microsoft.com/windows-server/administration/windows-commands/setx">https://learn.microsoft.com/windows-server/administration/windows-commands/setx</a></dt><dd><p>The <code class="docutils literal notranslate"><span class="pre">setx</span></code> command, for permanently modifying environment variables</p>
 | ||
| </dd>
 | ||
| </dl>
 | ||
| </div>
 | ||
| </section>
 | ||
| <section id="finding-the-python-executable">
 | ||
| <span id="windows-path-mod"></span><h3><span class="section-number">4.6.2. </span>Finding the Python executable<a class="headerlink" href="#finding-the-python-executable" title="Link to this heading">¶</a></h3>
 | ||
| <div class="versionchanged">
 | ||
| <p><span class="versionmodified changed">Changed in version 3.5.</span></p>
 | ||
| </div>
 | ||
| <p>Besides using the automatically created start menu entry for the Python
 | ||
| interpreter, you might want to start Python in the command prompt. The
 | ||
| installer has an option to set that up for you.</p>
 | ||
| <p>On the first page of the installer, an option labelled “Add Python to PATH”
 | ||
| may be selected to have the installer add the install location into the
 | ||
| <span class="target" id="index-13"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PATH</span></code>.  The location of the <code class="file docutils literal notranslate"><span class="pre">Scripts\</span></code> folder is also added.
 | ||
| This allows you to type <strong class="command">python</strong> to run the interpreter, and
 | ||
| <strong class="command">pip</strong> for the package installer. Thus, you can also execute your
 | ||
| scripts with command line options, see <a class="reference internal" href="cmdline.html#using-on-cmdline"><span class="std std-ref">Command line</span></a> documentation.</p>
 | ||
| <p>If you don’t enable this option at install time, you can always re-run the
 | ||
| installer, select Modify, and enable it.  Alternatively, you can manually
 | ||
| modify the <span class="target" id="index-14"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PATH</span></code> using the directions in <a class="reference internal" href="#setting-envvars"><span class="std std-ref">Excursus: Setting environment variables</span></a>.  You
 | ||
| need to set your <span class="target" id="index-15"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PATH</span></code> environment variable to include the directory
 | ||
| of your Python installation, delimited by a semicolon from other entries.  An
 | ||
| example variable could look like this (assuming the first two entries already
 | ||
| existed):</p>
 | ||
| <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Python 3.9
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| </section>
 | ||
| </section>
 | ||
| <section id="utf-8-mode">
 | ||
| <span id="win-utf8-mode"></span><h2><span class="section-number">4.7. </span>UTF-8 mode<a class="headerlink" href="#utf-8-mode" title="Link to this heading">¶</a></h2>
 | ||
| <div class="versionadded">
 | ||
| <p><span class="versionmodified added">Added in version 3.7.</span></p>
 | ||
| </div>
 | ||
| <p>Windows still uses legacy encodings for the system encoding (the ANSI Code
 | ||
| Page).  Python uses it for the default encoding of text files (e.g.
 | ||
| <a class="reference internal" href="../library/locale.html#locale.getencoding" title="locale.getencoding"><code class="xref py py-func docutils literal notranslate"><span class="pre">locale.getencoding()</span></code></a>).</p>
 | ||
| <p>This may cause issues because UTF-8 is widely used on the internet
 | ||
| and most Unix systems, including WSL (Windows Subsystem for Linux).</p>
 | ||
| <p>You can use the <a class="reference internal" href="../library/os.html#utf8-mode"><span class="std std-ref">Python UTF-8 Mode</span></a> to change the default text
 | ||
| encoding to UTF-8. You can enable the <a class="reference internal" href="../library/os.html#utf8-mode"><span class="std std-ref">Python UTF-8 Mode</span></a> via
 | ||
| the <code class="docutils literal notranslate"><span class="pre">-X</span> <span class="pre">utf8</span></code> command line option, or the <code class="docutils literal notranslate"><span class="pre">PYTHONUTF8=1</span></code> environment
 | ||
| variable.  See <span class="target" id="index-16"></span><a class="reference internal" href="cmdline.html#envvar-PYTHONUTF8"><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PYTHONUTF8</span></code></a> for enabling UTF-8 mode, and
 | ||
| <a class="reference internal" href="#setting-envvars"><span class="std std-ref">Excursus: Setting environment variables</span></a> for how to modify environment variables.</p>
 | ||
| <p>When the <a class="reference internal" href="../library/os.html#utf8-mode"><span class="std std-ref">Python UTF-8 Mode</span></a> is enabled, you can still use the
 | ||
| system encoding (the ANSI Code Page) via the “mbcs” codec.</p>
 | ||
| <p>Note that adding <code class="docutils literal notranslate"><span class="pre">PYTHONUTF8=1</span></code> to the default environment variables
 | ||
| will affect all Python 3.7+ applications on your system.
 | ||
| If you have any Python 3.7+ applications which rely on the legacy
 | ||
| system encoding, it is recommended to set the environment variable
 | ||
| temporarily or use the <code class="docutils literal notranslate"><span class="pre">-X</span> <span class="pre">utf8</span></code> command line option.</p>
 | ||
| <div class="admonition note">
 | ||
| <p class="admonition-title">Note</p>
 | ||
| <p>Even when UTF-8 mode is disabled, Python uses UTF-8 by default
 | ||
| on Windows for:</p>
 | ||
| <ul class="simple">
 | ||
| <li><p>Console I/O including standard I/O (see <span class="target" id="index-17"></span><a class="pep reference external" href="https://peps.python.org/pep-0528/"><strong>PEP 528</strong></a> for details).</p></li>
 | ||
| <li><p>The <a class="reference internal" href="../glossary.html#term-filesystem-encoding-and-error-handler"><span class="xref std std-term">filesystem encoding</span></a>
 | ||
| (see <span class="target" id="index-18"></span><a class="pep reference external" href="https://peps.python.org/pep-0529/"><strong>PEP 529</strong></a> for details).</p></li>
 | ||
| </ul>
 | ||
| </div>
 | ||
| </section>
 | ||
| <section id="python-launcher-for-windows">
 | ||
| <span id="launcher"></span><h2><span class="section-number">4.8. </span>Python Launcher for Windows<a class="headerlink" href="#python-launcher-for-windows" title="Link to this heading">¶</a></h2>
 | ||
| <div class="versionadded">
 | ||
| <p><span class="versionmodified added">Added in version 3.3.</span></p>
 | ||
| </div>
 | ||
| <p>The Python launcher for Windows is a utility which aids in locating and
 | ||
| executing of different Python versions.  It allows scripts (or the
 | ||
| command-line) to indicate a preference for a specific Python version, and
 | ||
| will locate and execute that version.</p>
 | ||
| <p>Unlike the <span class="target" id="index-19"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PATH</span></code> variable, the launcher will correctly select the most
 | ||
| appropriate version of Python. It will prefer per-user installations over
 | ||
| system-wide ones, and orders by language version rather than using the most
 | ||
| recently installed version.</p>
 | ||
| <p>The launcher was originally specified in <span class="target" id="index-20"></span><a class="pep reference external" href="https://peps.python.org/pep-0397/"><strong>PEP 397</strong></a>.</p>
 | ||
| <section id="getting-started">
 | ||
| <h3><span class="section-number">4.8.1. </span>Getting started<a class="headerlink" href="#getting-started" title="Link to this heading">¶</a></h3>
 | ||
| <section id="from-the-command-line">
 | ||
| <h4><span class="section-number">4.8.1.1. </span>From the command-line<a class="headerlink" href="#from-the-command-line" title="Link to this heading">¶</a></h4>
 | ||
| <div class="versionchanged">
 | ||
| <p><span class="versionmodified changed">Changed in version 3.6.</span></p>
 | ||
| </div>
 | ||
| <p>System-wide installations of Python 3.3 and later will put the launcher on your
 | ||
| <span class="target" id="index-21"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PATH</span></code>. The launcher is compatible with all available versions of
 | ||
| Python, so it does not matter which version is installed. To check that the
 | ||
| launcher is available, execute the following command in Command Prompt:</p>
 | ||
| <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>py
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| <p>You should find that the latest version of Python you have installed is
 | ||
| started - it can be exited as normal, and any additional command-line
 | ||
| arguments specified will be sent directly to Python.</p>
 | ||
| <p>If you have multiple versions of Python installed (e.g., 3.7 and 3.13) you
 | ||
| will have noticed that Python 3.13 was started - to launch Python 3.7, try
 | ||
| the command:</p>
 | ||
| <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>py -3.7
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| <p>If you want the latest version of Python 2 you have installed, try the
 | ||
| command:</p>
 | ||
| <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>py -2
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| <p>If you see the following error, you do not have the launcher installed:</p>
 | ||
| <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>'py' is not recognized as an internal or external command,
 | ||
| operable program or batch file.
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| <p>The command:</p>
 | ||
| <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>py --list
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| <p>displays the currently installed version(s) of Python.</p>
 | ||
| <p>The <code class="docutils literal notranslate"><span class="pre">-x.y</span></code> argument is the short form of the <code class="docutils literal notranslate"><span class="pre">-V:Company/Tag</span></code> argument,
 | ||
| which allows selecting a specific Python runtime, including those that may have
 | ||
| come from somewhere other than python.org. Any runtime registered by following
 | ||
| <span class="target" id="index-22"></span><a class="pep reference external" href="https://peps.python.org/pep-0514/"><strong>PEP 514</strong></a> will be discoverable. The <code class="docutils literal notranslate"><span class="pre">--list</span></code> command lists all available
 | ||
| runtimes using the <code class="docutils literal notranslate"><span class="pre">-V:</span></code> format.</p>
 | ||
| <p>When using the <code class="docutils literal notranslate"><span class="pre">-V:</span></code> argument, specifying the Company will limit selection to
 | ||
| runtimes from that provider, while specifying only the Tag will select from all
 | ||
| providers. Note that omitting the slash implies a tag:</p>
 | ||
| <div class="highlight-none notranslate"><div class="highlight"><pre><span></span># Select any '3.*' tagged runtime
 | ||
| py -V:3
 | ||
| 
 | ||
| # Select any 'PythonCore' released runtime
 | ||
| py -V:PythonCore/
 | ||
| 
 | ||
| # Select PythonCore's latest Python 3 runtime
 | ||
| py -V:PythonCore/3
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| <p>The short form of the argument (<code class="docutils literal notranslate"><span class="pre">-3</span></code>) only ever selects from core Python
 | ||
| releases, and not other distributions. However, the longer form (<code class="docutils literal notranslate"><span class="pre">-V:3</span></code>) will
 | ||
| select from any.</p>
 | ||
| <p>The Company is matched on the full string, case-insensitive. The Tag is matched
 | ||
| on either the full string, or a prefix, provided the next character is a dot or a
 | ||
| hyphen. This allows <code class="docutils literal notranslate"><span class="pre">-V:3.1</span></code> to match <code class="docutils literal notranslate"><span class="pre">3.1-32</span></code>, but not <code class="docutils literal notranslate"><span class="pre">3.10</span></code>. Tags are
 | ||
| sorted using numerical ordering (<code class="docutils literal notranslate"><span class="pre">3.10</span></code> is newer than <code class="docutils literal notranslate"><span class="pre">3.1</span></code>), but are
 | ||
| compared using text (<code class="docutils literal notranslate"><span class="pre">-V:3.01</span></code> does not match <code class="docutils literal notranslate"><span class="pre">3.1</span></code>).</p>
 | ||
| </section>
 | ||
| <section id="virtual-environments">
 | ||
| <h4><span class="section-number">4.8.1.2. </span>Virtual environments<a class="headerlink" href="#virtual-environments" title="Link to this heading">¶</a></h4>
 | ||
| <div class="versionadded">
 | ||
| <p><span class="versionmodified added">Added in version 3.5.</span></p>
 | ||
| </div>
 | ||
| <p>If the launcher is run with no explicit Python version specification, and a
 | ||
| virtual environment (created with the standard library <a class="reference internal" href="../library/venv.html#module-venv" title="venv: Creation of virtual environments."><code class="xref py py-mod docutils literal notranslate"><span class="pre">venv</span></code></a> module or
 | ||
| the external <code class="docutils literal notranslate"><span class="pre">virtualenv</span></code> tool) active, the launcher will run the virtual
 | ||
| environment’s interpreter rather than the global one.  To run the global
 | ||
| interpreter, either deactivate the virtual environment, or explicitly specify
 | ||
| the global Python version.</p>
 | ||
| </section>
 | ||
| <section id="from-a-script">
 | ||
| <h4><span class="section-number">4.8.1.3. </span>From a script<a class="headerlink" href="#from-a-script" title="Link to this heading">¶</a></h4>
 | ||
| <p>Let’s create a test Python script - create a file called <code class="docutils literal notranslate"><span class="pre">hello.py</span></code> with the
 | ||
| following contents</p>
 | ||
| <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="ch">#! python</span>
 | ||
| <span class="kn">import</span><span class="w"> </span><span class="nn">sys</span>
 | ||
| <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">"hello from Python </span><span class="si">%s</span><span class="se">\n</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">version</span><span class="p">,))</span>
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| <p>From the directory in which hello.py lives, execute the command:</p>
 | ||
| <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>py hello.py
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| <p>You should notice the version number of your latest Python 2.x installation
 | ||
| is printed.  Now try changing the first line to be:</p>
 | ||
| <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="ch">#! python3</span>
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| <p>Re-executing the command should now print the latest Python 3.x information.
 | ||
| As with the above command-line examples, you can specify a more explicit
 | ||
| version qualifier.  Assuming you have Python 3.7 installed, try changing
 | ||
| the first line to <code class="docutils literal notranslate"><span class="pre">#!</span> <span class="pre">python3.7</span></code> and you should find the 3.7
 | ||
| version information printed.</p>
 | ||
| <p>Note that unlike interactive use, a bare “python” will use the latest
 | ||
| version of Python 2.x that you have installed.  This is for backward
 | ||
| compatibility and for compatibility with Unix, where the command <code class="docutils literal notranslate"><span class="pre">python</span></code>
 | ||
| typically refers to Python 2.</p>
 | ||
| </section>
 | ||
| <section id="from-file-associations">
 | ||
| <h4><span class="section-number">4.8.1.4. </span>From file associations<a class="headerlink" href="#from-file-associations" title="Link to this heading">¶</a></h4>
 | ||
| <p>The launcher should have been associated with Python files (i.e. <code class="docutils literal notranslate"><span class="pre">.py</span></code>,
 | ||
| <code class="docutils literal notranslate"><span class="pre">.pyw</span></code>, <code class="docutils literal notranslate"><span class="pre">.pyc</span></code> files) when it was installed.  This means that
 | ||
| when you double-click on one of these files from Windows explorer the launcher
 | ||
| will be used, and therefore you can use the same facilities described above to
 | ||
| have the script specify the version which should be used.</p>
 | ||
| <p>The key benefit of this is that a single launcher can support multiple Python
 | ||
| versions at the same time depending on the contents of the first line.</p>
 | ||
| </section>
 | ||
| </section>
 | ||
| <section id="shebang-lines">
 | ||
| <h3><span class="section-number">4.8.2. </span>Shebang Lines<a class="headerlink" href="#shebang-lines" title="Link to this heading">¶</a></h3>
 | ||
| <p>If the first line of a script file starts with <code class="docutils literal notranslate"><span class="pre">#!</span></code>, it is known as a
 | ||
| “shebang” line.  Linux and other Unix like operating systems have native
 | ||
| support for such lines and they are commonly used on such systems to indicate
 | ||
| how a script should be executed.  This launcher allows the same facilities to
 | ||
| be used with Python scripts on Windows and the examples above demonstrate their
 | ||
| use.</p>
 | ||
| <p>To allow shebang lines in Python scripts to be portable between Unix and
 | ||
| Windows, this launcher supports a number of ‘virtual’ commands to specify
 | ||
| which interpreter to use.  The supported virtual commands are:</p>
 | ||
| <ul class="simple">
 | ||
| <li><p><code class="docutils literal notranslate"><span class="pre">/usr/bin/env</span></code></p></li>
 | ||
| <li><p><code class="docutils literal notranslate"><span class="pre">/usr/bin/python</span></code></p></li>
 | ||
| <li><p><code class="docutils literal notranslate"><span class="pre">/usr/local/bin/python</span></code></p></li>
 | ||
| <li><p><code class="docutils literal notranslate"><span class="pre">python</span></code></p></li>
 | ||
| </ul>
 | ||
| <p>For example, if the first line of your script starts with</p>
 | ||
| <div class="highlight-sh notranslate"><div class="highlight"><pre><span></span><span class="ch">#! /usr/bin/python</span>
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| <p>The default Python or an active virtual environment will be located and used.
 | ||
| As many Python scripts written to work on Unix will already have this line,
 | ||
| you should find these scripts can be used by the launcher without modification.
 | ||
| If you are writing a new script on Windows which you hope will be useful on
 | ||
| Unix, you should use one of the shebang lines starting with <code class="docutils literal notranslate"><span class="pre">/usr</span></code>.</p>
 | ||
| <p>Any of the above virtual commands can be suffixed with an explicit version
 | ||
| (either just the major version, or the major and minor version).
 | ||
| Furthermore the 32-bit version can be requested by adding “-32” after the
 | ||
| minor version. I.e. <code class="docutils literal notranslate"><span class="pre">/usr/bin/python3.7-32</span></code> will request usage of the
 | ||
| 32-bit Python 3.7. If a virtual environment is active, the version will be
 | ||
| ignored and the environment will be used.</p>
 | ||
| <div class="versionadded">
 | ||
| <p><span class="versionmodified added">Added in version 3.7: </span>Beginning with python launcher 3.7 it is possible to request 64-bit version
 | ||
| by the “-64” suffix. Furthermore it is possible to specify a major and
 | ||
| architecture without minor (i.e. <code class="docutils literal notranslate"><span class="pre">/usr/bin/python3-64</span></code>).</p>
 | ||
| </div>
 | ||
| <div class="versionchanged">
 | ||
| <p><span class="versionmodified changed">Changed in version 3.11: </span>The “-64” suffix is deprecated, and now implies “any architecture that is
 | ||
| not provably i386/32-bit”. To request a specific environment, use the new
 | ||
| <code class="samp docutils literal notranslate"><span class="pre">-V:</span><em><span class="pre">TAG</span></em></code> argument with the complete tag.</p>
 | ||
| </div>
 | ||
| <div class="versionchanged">
 | ||
| <p><span class="versionmodified changed">Changed in version 3.13: </span>Virtual commands referencing <code class="docutils literal notranslate"><span class="pre">python</span></code> now prefer an active virtual
 | ||
| environment rather than searching <span class="target" id="index-23"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PATH</span></code>. This handles cases where
 | ||
| the shebang specifies <code class="docutils literal notranslate"><span class="pre">/usr/bin/env</span> <span class="pre">python3</span></code> but <code class="file docutils literal notranslate"><span class="pre">python3.exe</span></code> is
 | ||
| not present in the active environment.</p>
 | ||
| </div>
 | ||
| <p>The <code class="docutils literal notranslate"><span class="pre">/usr/bin/env</span></code> form of shebang line has one further special property.
 | ||
| Before looking for installed Python interpreters, this form will search the
 | ||
| executable <span class="target" id="index-24"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PATH</span></code> for a Python executable matching the name provided
 | ||
| as the first argument. This corresponds to the behaviour of the Unix <code class="docutils literal notranslate"><span class="pre">env</span></code>
 | ||
| program, which performs a <span class="target" id="index-25"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PATH</span></code> search.
 | ||
| If an executable matching the first argument after the <code class="docutils literal notranslate"><span class="pre">env</span></code> command cannot
 | ||
| be found, but the argument starts with <code class="docutils literal notranslate"><span class="pre">python</span></code>, it will be handled as
 | ||
| described for the other virtual commands.
 | ||
| The environment variable <span class="target" id="index-26"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PYLAUNCHER_NO_SEARCH_PATH</span></code> may be set
 | ||
| (to any value) to skip this search of <span class="target" id="index-27"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PATH</span></code>.</p>
 | ||
| <p>Shebang lines that do not match any of these patterns are looked up in the
 | ||
| <code class="docutils literal notranslate"><span class="pre">[commands]</span></code> section of the launcher’s <a class="reference internal" href="#launcher-ini"><span class="std std-ref">.INI file</span></a>.
 | ||
| This may be used to handle certain commands in a way that makes sense for your
 | ||
| system. The name of the command must be a single argument (no spaces in the
 | ||
| shebang executable), and the value substituted is the full path to the
 | ||
| executable (additional arguments specified in the .INI will be quoted as part
 | ||
| of the filename).</p>
 | ||
| <div class="highlight-ini notranslate"><div class="highlight"><pre><span></span><span class="k">[commands]</span>
 | ||
| <span class="na">/bin/xpython</span><span class="o">=</span><span class="s">C:\Program Files\XPython\python.exe</span>
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| <p>Any commands not found in the .INI file are treated as <strong>Windows</strong> executable
 | ||
| paths that are absolute or relative to the directory containing the script file.
 | ||
| This is a convenience for Windows-only scripts, such as those generated by an
 | ||
| installer, since the behavior is not compatible with Unix-style shells.
 | ||
| These paths may be quoted, and may include multiple arguments, after which the
 | ||
| path to the script and any additional arguments will be appended.</p>
 | ||
| </section>
 | ||
| <section id="arguments-in-shebang-lines">
 | ||
| <h3><span class="section-number">4.8.3. </span>Arguments in shebang lines<a class="headerlink" href="#arguments-in-shebang-lines" title="Link to this heading">¶</a></h3>
 | ||
| <p>The shebang lines can also specify additional options to be passed to the
 | ||
| Python interpreter.  For example, if you have a shebang line:</p>
 | ||
| <div class="highlight-sh notranslate"><div class="highlight"><pre><span></span><span class="ch">#! /usr/bin/python -v</span>
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| <p>Then Python will be started with the <code class="docutils literal notranslate"><span class="pre">-v</span></code> option</p>
 | ||
| </section>
 | ||
| <section id="customization">
 | ||
| <h3><span class="section-number">4.8.4. </span>Customization<a class="headerlink" href="#customization" title="Link to this heading">¶</a></h3>
 | ||
| <section id="customization-via-ini-files">
 | ||
| <span id="launcher-ini"></span><h4><span class="section-number">4.8.4.1. </span>Customization via INI files<a class="headerlink" href="#customization-via-ini-files" title="Link to this heading">¶</a></h4>
 | ||
| <p>Two .ini files will be searched by the launcher - <code class="docutils literal notranslate"><span class="pre">py.ini</span></code> in the current
 | ||
| user’s application data directory (<code class="docutils literal notranslate"><span class="pre">%LOCALAPPDATA%</span></code> or <code class="docutils literal notranslate"><span class="pre">$env:LocalAppData</span></code>)
 | ||
| and <code class="docutils literal notranslate"><span class="pre">py.ini</span></code> in the same directory as the launcher. The same .ini files are
 | ||
| used for both the ‘console’ version of the launcher (i.e. py.exe) and for the
 | ||
| ‘windows’ version (i.e. pyw.exe).</p>
 | ||
| <p>Customization specified in the “application directory” will have precedence over
 | ||
| the one next to the executable, so a user, who may not have write access to the
 | ||
| .ini file next to the launcher, can override commands in that global .ini file.</p>
 | ||
| </section>
 | ||
| <section id="customizing-default-python-versions">
 | ||
| <h4><span class="section-number">4.8.4.2. </span>Customizing default Python versions<a class="headerlink" href="#customizing-default-python-versions" title="Link to this heading">¶</a></h4>
 | ||
| <p>In some cases, a version qualifier can be included in a command to dictate
 | ||
| which version of Python will be used by the command. A version qualifier
 | ||
| starts with a major version number and can optionally be followed by a period
 | ||
| (‘.’) and a minor version specifier. Furthermore it is possible to specify
 | ||
| if a 32 or 64 bit implementation shall be requested by adding “-32” or “-64”.</p>
 | ||
| <p>For example, a shebang line of <code class="docutils literal notranslate"><span class="pre">#!python</span></code> has no version qualifier, while
 | ||
| <code class="docutils literal notranslate"><span class="pre">#!python3</span></code> has a version qualifier which specifies only a major version.</p>
 | ||
| <p>If no version qualifiers are found in a command, the environment
 | ||
| variable <span class="target" id="index-28"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PY_PYTHON</span></code> can be set to specify the default version
 | ||
| qualifier. If it is not set, the default is “3”. The variable can
 | ||
| specify any value that may be passed on the command line, such as “3”,
 | ||
| “3.7”, “3.7-32” or “3.7-64”. (Note that the “-64” option is only
 | ||
| available with the launcher included with Python 3.7 or newer.)</p>
 | ||
| <p>If no minor version qualifiers are found, the environment variable
 | ||
| <code class="docutils literal notranslate"><span class="pre">PY_PYTHON{major}</span></code> (where <code class="docutils literal notranslate"><span class="pre">{major}</span></code> is the current major version qualifier
 | ||
| as determined above) can be set to specify the full version. If no such option
 | ||
| is found, the launcher will enumerate the installed Python versions and use
 | ||
| the latest minor release found for the major version, which is likely,
 | ||
| although not guaranteed, to be the most recently installed version in that
 | ||
| family.</p>
 | ||
| <p>On 64-bit Windows with both 32-bit and 64-bit implementations of the same
 | ||
| (major.minor) Python version installed, the 64-bit version will always be
 | ||
| preferred. This will be true for both 32-bit and 64-bit implementations of the
 | ||
| launcher - a 32-bit launcher will prefer to execute a 64-bit Python installation
 | ||
| of the specified version if available. This is so the behavior of the launcher
 | ||
| can be predicted knowing only what versions are installed on the PC and
 | ||
| without regard to the order in which they were installed (i.e., without knowing
 | ||
| whether a 32 or 64-bit version of Python and corresponding launcher was
 | ||
| installed last). As noted above, an optional “-32” or “-64” suffix can be
 | ||
| used on a version specifier to change this behaviour.</p>
 | ||
| <p>Examples:</p>
 | ||
| <ul class="simple">
 | ||
| <li><p>If no relevant options are set, the commands <code class="docutils literal notranslate"><span class="pre">python</span></code> and
 | ||
| <code class="docutils literal notranslate"><span class="pre">python2</span></code> will use the latest Python 2.x version installed and
 | ||
| the command <code class="docutils literal notranslate"><span class="pre">python3</span></code> will use the latest Python 3.x installed.</p></li>
 | ||
| <li><p>The command <code class="docutils literal notranslate"><span class="pre">python3.7</span></code> will not consult any
 | ||
| options at all as the versions are fully specified.</p></li>
 | ||
| <li><p>If <code class="docutils literal notranslate"><span class="pre">PY_PYTHON=3</span></code>, the commands <code class="docutils literal notranslate"><span class="pre">python</span></code> and <code class="docutils literal notranslate"><span class="pre">python3</span></code> will both use
 | ||
| the latest installed Python 3 version.</p></li>
 | ||
| <li><p>If <code class="docutils literal notranslate"><span class="pre">PY_PYTHON=3.7-32</span></code>, the command <code class="docutils literal notranslate"><span class="pre">python</span></code> will use the 32-bit
 | ||
| implementation of 3.7 whereas the command <code class="docutils literal notranslate"><span class="pre">python3</span></code> will use the latest
 | ||
| installed Python (PY_PYTHON was not considered at all as a major
 | ||
| version was specified.)</p></li>
 | ||
| <li><p>If <code class="docutils literal notranslate"><span class="pre">PY_PYTHON=3</span></code> and <code class="docutils literal notranslate"><span class="pre">PY_PYTHON3=3.7</span></code>, the commands
 | ||
| <code class="docutils literal notranslate"><span class="pre">python</span></code> and <code class="docutils literal notranslate"><span class="pre">python3</span></code> will both use specifically 3.7</p></li>
 | ||
| </ul>
 | ||
| <p>In addition to environment variables, the same settings can be configured
 | ||
| in the .INI file used by the launcher.  The section in the INI file is
 | ||
| called <code class="docutils literal notranslate"><span class="pre">[defaults]</span></code> and the key name will be the same as the
 | ||
| environment variables without the leading <code class="docutils literal notranslate"><span class="pre">PY_</span></code> prefix (and note that
 | ||
| the key names in the INI file are case insensitive.)  The contents of
 | ||
| an environment variable will override things specified in the INI file.</p>
 | ||
| <p>For example:</p>
 | ||
| <ul class="simple">
 | ||
| <li><p>Setting <code class="docutils literal notranslate"><span class="pre">PY_PYTHON=3.7</span></code> is equivalent to the INI file containing:</p></li>
 | ||
| </ul>
 | ||
| <div class="highlight-ini notranslate"><div class="highlight"><pre><span></span><span class="k">[defaults]</span>
 | ||
| <span class="na">python</span><span class="o">=</span><span class="s">3.7</span>
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| <ul class="simple">
 | ||
| <li><p>Setting <code class="docutils literal notranslate"><span class="pre">PY_PYTHON=3</span></code> and <code class="docutils literal notranslate"><span class="pre">PY_PYTHON3=3.7</span></code> is equivalent to the INI file
 | ||
| containing:</p></li>
 | ||
| </ul>
 | ||
| <div class="highlight-ini notranslate"><div class="highlight"><pre><span></span><span class="k">[defaults]</span>
 | ||
| <span class="na">python</span><span class="o">=</span><span class="s">3</span>
 | ||
| <span class="na">python3</span><span class="o">=</span><span class="s">3.7</span>
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| </section>
 | ||
| </section>
 | ||
| <section id="diagnostics">
 | ||
| <h3><span class="section-number">4.8.5. </span>Diagnostics<a class="headerlink" href="#diagnostics" title="Link to this heading">¶</a></h3>
 | ||
| <p>If an environment variable <span class="target" id="index-29"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PYLAUNCHER_DEBUG</span></code> is set (to any value), the
 | ||
| launcher will print diagnostic information to stderr (i.e. to the console).
 | ||
| While this information manages to be simultaneously verbose <em>and</em> terse, it
 | ||
| should allow you to see what versions of Python were located, why a
 | ||
| particular version was chosen and the exact command-line used to execute the
 | ||
| target Python. It is primarily intended for testing and debugging.</p>
 | ||
| </section>
 | ||
| <section id="dry-run">
 | ||
| <h3><span class="section-number">4.8.6. </span>Dry Run<a class="headerlink" href="#dry-run" title="Link to this heading">¶</a></h3>
 | ||
| <p>If an environment variable <span class="target" id="index-30"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PYLAUNCHER_DRYRUN</span></code> is set (to any value),
 | ||
| the launcher will output the command it would have run, but will not actually
 | ||
| launch Python. This may be useful for tools that want to use the launcher to
 | ||
| detect and then launch Python directly. Note that the command written to
 | ||
| standard output is always encoded using UTF-8, and may not render correctly in
 | ||
| the console.</p>
 | ||
| </section>
 | ||
| <section id="install-on-demand">
 | ||
| <h3><span class="section-number">4.8.7. </span>Install on demand<a class="headerlink" href="#install-on-demand" title="Link to this heading">¶</a></h3>
 | ||
| <p>If an environment variable <span class="target" id="index-31"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PYLAUNCHER_ALLOW_INSTALL</span></code> is set (to any
 | ||
| value), and the requested Python version is not installed but is available on
 | ||
| the Microsoft Store, the launcher will attempt to install it. This may require
 | ||
| user interaction to complete, and you may need to run the command again.</p>
 | ||
| <p>An additional <span class="target" id="index-32"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PYLAUNCHER_ALWAYS_INSTALL</span></code> variable causes the launcher
 | ||
| to always try to install Python, even if it is detected. This is mainly intended
 | ||
| for testing (and should be used with <span class="target" id="index-33"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PYLAUNCHER_DRYRUN</span></code>).</p>
 | ||
| </section>
 | ||
| <section id="return-codes">
 | ||
| <h3><span class="section-number">4.8.8. </span>Return codes<a class="headerlink" href="#return-codes" title="Link to this heading">¶</a></h3>
 | ||
| <p>The following exit codes may be returned by the Python launcher. Unfortunately,
 | ||
| there is no way to distinguish these from the exit code of Python itself.</p>
 | ||
| <p>The names of codes are as used in the sources, and are only for reference. There
 | ||
| is no way to access or resolve them apart from reading this page. Entries are
 | ||
| listed in alphabetical order of names.</p>
 | ||
| <table class="docutils align-default">
 | ||
| <thead>
 | ||
| <tr class="row-odd"><th class="head"><p>Name</p></th>
 | ||
| <th class="head"><p>Value</p></th>
 | ||
| <th class="head"><p>Description</p></th>
 | ||
| </tr>
 | ||
| </thead>
 | ||
| <tbody>
 | ||
| <tr class="row-even"><td><p>RC_BAD_VENV_CFG</p></td>
 | ||
| <td><p>107</p></td>
 | ||
| <td><p>A <code class="file docutils literal notranslate"><span class="pre">pyvenv.cfg</span></code> was found but is corrupt.</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-odd"><td><p>RC_CREATE_PROCESS</p></td>
 | ||
| <td><p>101</p></td>
 | ||
| <td><p>Failed to launch Python.</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-even"><td><p>RC_INSTALLING</p></td>
 | ||
| <td><p>111</p></td>
 | ||
| <td><p>An install was started, but the command will
 | ||
| need to be re-run after it completes.</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-odd"><td><p>RC_INTERNAL_ERROR</p></td>
 | ||
| <td><p>109</p></td>
 | ||
| <td><p>Unexpected error. Please report a bug.</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-even"><td><p>RC_NO_COMMANDLINE</p></td>
 | ||
| <td><p>108</p></td>
 | ||
| <td><p>Unable to obtain command line from the
 | ||
| operating system.</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-odd"><td><p>RC_NO_PYTHON</p></td>
 | ||
| <td><p>103</p></td>
 | ||
| <td><p>Unable to locate the requested version.</p></td>
 | ||
| </tr>
 | ||
| <tr class="row-even"><td><p>RC_NO_VENV_CFG</p></td>
 | ||
| <td><p>106</p></td>
 | ||
| <td><p>A <code class="file docutils literal notranslate"><span class="pre">pyvenv.cfg</span></code> was required but not
 | ||
| found.</p></td>
 | ||
| </tr>
 | ||
| </tbody>
 | ||
| </table>
 | ||
| </section>
 | ||
| </section>
 | ||
| <section id="finding-modules">
 | ||
| <span id="windows-finding-modules"></span><h2><span class="section-number">4.9. </span>Finding modules<a class="headerlink" href="#finding-modules" title="Link to this heading">¶</a></h2>
 | ||
| <p>These notes supplement the description at <a class="reference internal" href="../library/sys_path_init.html#sys-path-init"><span class="std std-ref">The initialization of the sys.path module search path</span></a> with
 | ||
| detailed Windows notes.</p>
 | ||
| <p>When no <code class="docutils literal notranslate"><span class="pre">._pth</span></code> file is found, this is how <a class="reference internal" href="../library/sys.html#sys.path" title="sys.path"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.path</span></code></a> is populated on
 | ||
| Windows:</p>
 | ||
| <ul class="simple">
 | ||
| <li><p>An empty entry is added at the start, which corresponds to the current
 | ||
| directory.</p></li>
 | ||
| <li><p>If the environment variable <span class="target" id="index-34"></span><a class="reference internal" href="cmdline.html#envvar-PYTHONPATH"><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PYTHONPATH</span></code></a> exists, as described in
 | ||
| <a class="reference internal" href="cmdline.html#using-on-envvars"><span class="std std-ref">Environment variables</span></a>, its entries are added next.  Note that on Windows,
 | ||
| paths in this variable must be separated by semicolons, to distinguish them
 | ||
| from the colon used in drive identifiers (<code class="docutils literal notranslate"><span class="pre">C:\</span></code> etc.).</p></li>
 | ||
| <li><p>Additional “application paths” can be added in the registry as subkeys of
 | ||
| <code class="samp docutils literal notranslate"><span class="pre">\SOFTWARE\Python\PythonCore{version}\PythonPath</span></code> under both the
 | ||
| <code class="docutils literal notranslate"><span class="pre">HKEY_CURRENT_USER</span></code> and <code class="docutils literal notranslate"><span class="pre">HKEY_LOCAL_MACHINE</span></code> hives.  Subkeys which have
 | ||
| semicolon-delimited path strings as their default value will cause each path
 | ||
| to be added to <a class="reference internal" href="../library/sys.html#sys.path" title="sys.path"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.path</span></code></a>.  (Note that all known installers only use
 | ||
| HKLM, so HKCU is typically empty.)</p></li>
 | ||
| <li><p>If the environment variable <span class="target" id="index-35"></span><a class="reference internal" href="cmdline.html#envvar-PYTHONHOME"><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PYTHONHOME</span></code></a> is set, it is assumed as
 | ||
| “Python Home”.  Otherwise, the path of the main Python executable is used to
 | ||
| locate a “landmark file” (either <code class="docutils literal notranslate"><span class="pre">Lib\os.py</span></code> or <code class="docutils literal notranslate"><span class="pre">pythonXY.zip</span></code>) to deduce
 | ||
| the “Python Home”.  If a Python home is found, the relevant sub-directories
 | ||
| added to <a class="reference internal" href="../library/sys.html#sys.path" title="sys.path"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.path</span></code></a> (<code class="docutils literal notranslate"><span class="pre">Lib</span></code>, <code class="docutils literal notranslate"><span class="pre">plat-win</span></code>, etc) are based on that
 | ||
| folder.  Otherwise, the core Python path is constructed from the PythonPath
 | ||
| stored in the registry.</p></li>
 | ||
| <li><p>If the Python Home cannot be located, no <span class="target" id="index-36"></span><a class="reference internal" href="cmdline.html#envvar-PYTHONPATH"><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PYTHONPATH</span></code></a> is specified in
 | ||
| the environment, and no registry entries can be found, a default path with
 | ||
| relative entries is used (e.g. <code class="docutils literal notranslate"><span class="pre">.\Lib;.\plat-win</span></code>, etc).</p></li>
 | ||
| </ul>
 | ||
| <p>If a <code class="docutils literal notranslate"><span class="pre">pyvenv.cfg</span></code> file is found alongside the main executable or in the
 | ||
| directory one level above the executable, the following variations apply:</p>
 | ||
| <ul class="simple">
 | ||
| <li><p>If <code class="docutils literal notranslate"><span class="pre">home</span></code> is an absolute path and <span class="target" id="index-37"></span><a class="reference internal" href="cmdline.html#envvar-PYTHONHOME"><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PYTHONHOME</span></code></a> is not set, this
 | ||
| path is used instead of the path to the main executable when deducing the
 | ||
| home location.</p></li>
 | ||
| </ul>
 | ||
| <p>The end result of all this is:</p>
 | ||
| <ul class="simple">
 | ||
| <li><p>When running <code class="file docutils literal notranslate"><span class="pre">python.exe</span></code>, or any other .exe in the main Python
 | ||
| directory (either an installed version, or directly from the PCbuild
 | ||
| directory), the core path is deduced, and the core paths in the registry are
 | ||
| ignored.  Other “application paths” in the registry are always read.</p></li>
 | ||
| <li><p>When Python is hosted in another .exe (different directory, embedded via COM,
 | ||
| etc), the “Python Home” will not be deduced, so the core path from the
 | ||
| registry is used.  Other “application paths” in the registry are always read.</p></li>
 | ||
| <li><p>If Python can’t find its home and there are no registry value (frozen .exe,
 | ||
| some very strange installation setup) you get a path with some default, but
 | ||
| relative, paths.</p></li>
 | ||
| </ul>
 | ||
| <p>For those who want to bundle Python into their application or distribution, the
 | ||
| following advice will prevent conflicts with other installations:</p>
 | ||
| <ul class="simple">
 | ||
| <li><p>Include a <code class="docutils literal notranslate"><span class="pre">._pth</span></code> file alongside your executable containing the
 | ||
| directories to include. This will ignore paths listed in the registry and
 | ||
| environment variables, and also ignore <a class="reference internal" href="../library/site.html#module-site" title="site: Module responsible for site-specific configuration."><code class="xref py py-mod docutils literal notranslate"><span class="pre">site</span></code></a> unless <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">site</span></code> is
 | ||
| listed.</p></li>
 | ||
| <li><p>If you are loading <code class="file docutils literal notranslate"><span class="pre">python3.dll</span></code> or <code class="file docutils literal notranslate"><span class="pre">python37.dll</span></code> in your own
 | ||
| executable, explicitly set <a class="reference internal" href="../c-api/init_config.html#c.PyConfig.module_search_paths" title="PyConfig.module_search_paths"><code class="xref c c-member docutils literal notranslate"><span class="pre">PyConfig.module_search_paths</span></code></a> before
 | ||
| <a class="reference internal" href="../c-api/init.html#c.Py_InitializeFromConfig" title="Py_InitializeFromConfig"><code class="xref c c-func docutils literal notranslate"><span class="pre">Py_InitializeFromConfig()</span></code></a>.</p></li>
 | ||
| <li><p>Clear and/or overwrite <span class="target" id="index-38"></span><a class="reference internal" href="cmdline.html#envvar-PYTHONPATH"><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PYTHONPATH</span></code></a> and set <span class="target" id="index-39"></span><a class="reference internal" href="cmdline.html#envvar-PYTHONHOME"><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PYTHONHOME</span></code></a>
 | ||
| before launching <code class="file docutils literal notranslate"><span class="pre">python.exe</span></code> from your application.</p></li>
 | ||
| <li><p>If you cannot use the previous suggestions (for example, you are a
 | ||
| distribution that allows people to run <code class="file docutils literal notranslate"><span class="pre">python.exe</span></code> directly), ensure
 | ||
| that the landmark file (<code class="file docutils literal notranslate"><span class="pre">Lib\os.py</span></code>) exists in your install directory.
 | ||
| (Note that it will not be detected inside a ZIP file, but a correctly named
 | ||
| ZIP file will be detected instead.)</p></li>
 | ||
| </ul>
 | ||
| <p>These will ensure that the files in a system-wide installation will not take
 | ||
| precedence over the copy of the standard library bundled with your application.
 | ||
| Otherwise, your users may experience problems using your application. Note that
 | ||
| the first suggestion is the best, as the others may still be susceptible to
 | ||
| non-standard paths in the registry and user site-packages.</p>
 | ||
| <div class="versionchanged">
 | ||
| <p><span class="versionmodified changed">Changed in version 3.6: </span>Add <code class="docutils literal notranslate"><span class="pre">._pth</span></code> file support and removes <code class="docutils literal notranslate"><span class="pre">applocal</span></code> option from
 | ||
| <code class="docutils literal notranslate"><span class="pre">pyvenv.cfg</span></code>.</p>
 | ||
| </div>
 | ||
| <div class="versionchanged">
 | ||
| <p><span class="versionmodified changed">Changed in version 3.6: </span>Add <code class="file docutils literal notranslate"><span class="pre">python</span><em><span class="pre">XX</span></em><span class="pre">.zip</span></code> as a potential landmark when directly adjacent
 | ||
| to the executable.</p>
 | ||
| </div>
 | ||
| <div class="deprecated">
 | ||
| <p><span class="versionmodified deprecated">Deprecated since version 3.6: </span>Modules specified in the registry under <code class="docutils literal notranslate"><span class="pre">Modules</span></code> (not <code class="docutils literal notranslate"><span class="pre">PythonPath</span></code>)
 | ||
| may be imported by <a class="reference internal" href="../library/importlib.html#importlib.machinery.WindowsRegistryFinder" title="importlib.machinery.WindowsRegistryFinder"><code class="xref py py-class docutils literal notranslate"><span class="pre">importlib.machinery.WindowsRegistryFinder</span></code></a>.
 | ||
| This finder is enabled on Windows in 3.6.0 and earlier, but may need to
 | ||
| be explicitly added to <a class="reference internal" href="../library/sys.html#sys.meta_path" title="sys.meta_path"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.meta_path</span></code></a> in the future.</p>
 | ||
| </div>
 | ||
| </section>
 | ||
| <section id="additional-modules">
 | ||
| <h2><span class="section-number">4.10. </span>Additional modules<a class="headerlink" href="#additional-modules" title="Link to this heading">¶</a></h2>
 | ||
| <p>Even though Python aims to be portable among all platforms, there are features
 | ||
| that are unique to Windows.  A couple of modules, both in the standard library
 | ||
| and external, and snippets exist to use these features.</p>
 | ||
| <p>The Windows-specific standard modules are documented in
 | ||
| <a class="reference internal" href="../library/windows.html#mswin-specific-services"><span class="std std-ref">MS Windows Specific Services</span></a>.</p>
 | ||
| <section id="pywin32">
 | ||
| <h3><span class="section-number">4.10.1. </span>PyWin32<a class="headerlink" href="#pywin32" title="Link to this heading">¶</a></h3>
 | ||
| <p>The <a class="extlink-pypi reference external" href="https://pypi.org/project/PyWin32/">PyWin32</a> module by Mark Hammond
 | ||
| is a collection of modules for advanced Windows-specific support.  This includes
 | ||
| utilities for:</p>
 | ||
| <ul class="simple">
 | ||
| <li><p><a class="reference external" href="https://learn.microsoft.com/windows/win32/com/component-object-model--com--portal">Component Object Model</a>
 | ||
| (COM)</p></li>
 | ||
| <li><p>Win32 API calls</p></li>
 | ||
| <li><p>Registry</p></li>
 | ||
| <li><p>Event log</p></li>
 | ||
| <li><p><a class="reference external" href="https://learn.microsoft.com/cpp/mfc/mfc-desktop-applications">Microsoft Foundation Classes</a>
 | ||
| (MFC) user interfaces</p></li>
 | ||
| </ul>
 | ||
| <p><a class="reference external" href="https://web.archive.org/web/20060524042422/https://www.python.org/windows/pythonwin/">PythonWin</a> is a sample MFC application
 | ||
| shipped with PyWin32.  It is an embeddable IDE with a built-in debugger.</p>
 | ||
| <div class="admonition seealso">
 | ||
| <p class="admonition-title">See also</p>
 | ||
| <dl class="simple">
 | ||
| <dt><a class="reference external" href="https://timgolden.me.uk/python/win32_how_do_i.html">Win32 How Do I…?</a></dt><dd><p>by Tim Golden</p>
 | ||
| </dd>
 | ||
| <dt><a class="reference external" href="https://www.boddie.org.uk/python/COM.html">Python and COM</a></dt><dd><p>by David and Paul Boddie</p>
 | ||
| </dd>
 | ||
| </dl>
 | ||
| </div>
 | ||
| </section>
 | ||
| <section id="cx-freeze">
 | ||
| <h3><span class="section-number">4.10.2. </span>cx_Freeze<a class="headerlink" href="#cx-freeze" title="Link to this heading">¶</a></h3>
 | ||
| <p><a class="reference external" href="https://cx-freeze.readthedocs.io/en/latest/">cx_Freeze</a>
 | ||
| wraps Python scripts into executable Windows programs
 | ||
| (<code class="file docutils literal notranslate"><em><span class="pre">*</span></em><span class="pre">.exe</span></code> files).  When you have done this, you can distribute your
 | ||
| application without requiring your users to install Python.</p>
 | ||
| </section>
 | ||
| </section>
 | ||
| <section id="compiling-python-on-windows">
 | ||
| <h2><span class="section-number">4.11. </span>Compiling Python on Windows<a class="headerlink" href="#compiling-python-on-windows" title="Link to this heading">¶</a></h2>
 | ||
| <p>If you want to compile CPython yourself, first thing you should do is get the
 | ||
| <a class="reference external" href="https://www.python.org/downloads/source/">source</a>. You can download either the
 | ||
| latest release’s source or just grab a fresh <a class="reference external" href="https://devguide.python.org/setup/#get-the-source-code">checkout</a>.</p>
 | ||
| <p>The source tree contains a build solution and project files for Microsoft
 | ||
| Visual Studio, which is the compiler used to build the official Python
 | ||
| releases. These files are in the <code class="file docutils literal notranslate"><span class="pre">PCbuild</span></code> directory.</p>
 | ||
| <p>Check <code class="file docutils literal notranslate"><span class="pre">PCbuild/readme.txt</span></code> for general information on the build process.</p>
 | ||
| <p>For extension modules, consult <a class="reference internal" href="../extending/windows.html#building-on-windows"><span class="std std-ref">Building C and C++ Extensions on Windows</span></a>.</p>
 | ||
| </section>
 | ||
| <section id="other-platforms">
 | ||
| <h2><span class="section-number">4.12. </span>Other Platforms<a class="headerlink" href="#other-platforms" title="Link to this heading">¶</a></h2>
 | ||
| <p>With ongoing development of Python, some platforms that used to be supported
 | ||
| earlier are no longer supported (due to the lack of users or developers).
 | ||
| Check <span class="target" id="index-40"></span><a class="pep reference external" href="https://peps.python.org/pep-0011/"><strong>PEP 11</strong></a> for details on all unsupported platforms.</p>
 | ||
| <ul class="simple">
 | ||
| <li><p><a class="reference external" href="https://pythonce.sourceforge.net/">Windows CE</a> is
 | ||
| <a class="reference external" href="https://github.com/python/cpython/issues/71542">no longer supported</a>
 | ||
| since Python 3 (if it ever was).</p></li>
 | ||
| <li><p>The <a class="reference external" href="https://cygwin.com/">Cygwin</a> installer offers to install the
 | ||
| <a class="reference external" href="https://cygwin.com/packages/summary/python3.html">Python interpreter</a>
 | ||
| as well</p></li>
 | ||
| </ul>
 | ||
| <p>See <a class="reference external" href="https://www.python.org/downloads/windows/">Python for Windows</a>
 | ||
| for detailed information about platforms with pre-compiled installers.</p>
 | ||
| </section>
 | ||
| </section>
 | ||
| 
 | ||
| 
 | ||
|             <div class="clearer"></div>
 | ||
|           </div>
 | ||
|         </div>
 | ||
|       </div>
 | ||
|       <div class="sphinxsidebar" role="navigation" aria-label="Main">
 | ||
|         <div class="sphinxsidebarwrapper">
 | ||
|   <div>
 | ||
|     <h3><a href="../contents.html">Table of Contents</a></h3>
 | ||
|     <ul>
 | ||
| <li><a class="reference internal" href="#">4. Using Python on Windows</a><ul>
 | ||
| <li><a class="reference internal" href="#the-full-installer">4.1. The full installer</a><ul>
 | ||
| <li><a class="reference internal" href="#installation-steps">4.1.1. Installation steps</a></li>
 | ||
| <li><a class="reference internal" href="#removing-the-max-path-limitation">4.1.2. Removing the MAX_PATH Limitation</a></li>
 | ||
| <li><a class="reference internal" href="#installing-without-ui">4.1.3. Installing Without UI</a></li>
 | ||
| <li><a class="reference internal" href="#installing-without-downloading">4.1.4. Installing Without Downloading</a></li>
 | ||
| <li><a class="reference internal" href="#modifying-an-install">4.1.5. Modifying an install</a></li>
 | ||
| <li><a class="reference internal" href="#installing-free-threaded-binaries">4.1.6. Installing Free-threaded Binaries</a></li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| <li><a class="reference internal" href="#the-microsoft-store-package">4.2. The Microsoft Store package</a><ul>
 | ||
| <li><a class="reference internal" href="#known-issues">4.2.1. Known issues</a><ul>
 | ||
| <li><a class="reference internal" href="#redirection-of-local-data-registry-and-temporary-paths">4.2.1.1. Redirection of local data, registry, and temporary paths</a></li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| <li><a class="reference internal" href="#the-nuget-org-packages">4.3. The nuget.org packages</a><ul>
 | ||
| <li><a class="reference internal" href="#free-threaded-packages">4.3.1. Free-threaded packages</a></li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| <li><a class="reference internal" href="#the-embeddable-package">4.4. The embeddable package</a><ul>
 | ||
| <li><a class="reference internal" href="#python-application">4.4.1. Python Application</a></li>
 | ||
| <li><a class="reference internal" href="#embedding-python">4.4.2. Embedding Python</a></li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| <li><a class="reference internal" href="#alternative-bundles">4.5. Alternative bundles</a></li>
 | ||
| <li><a class="reference internal" href="#configuring-python">4.6. Configuring Python</a><ul>
 | ||
| <li><a class="reference internal" href="#excursus-setting-environment-variables">4.6.1. Excursus: Setting environment variables</a></li>
 | ||
| <li><a class="reference internal" href="#finding-the-python-executable">4.6.2. Finding the Python executable</a></li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| <li><a class="reference internal" href="#utf-8-mode">4.7. UTF-8 mode</a></li>
 | ||
| <li><a class="reference internal" href="#python-launcher-for-windows">4.8. Python Launcher for Windows</a><ul>
 | ||
| <li><a class="reference internal" href="#getting-started">4.8.1. Getting started</a><ul>
 | ||
| <li><a class="reference internal" href="#from-the-command-line">4.8.1.1. From the command-line</a></li>
 | ||
| <li><a class="reference internal" href="#virtual-environments">4.8.1.2. Virtual environments</a></li>
 | ||
| <li><a class="reference internal" href="#from-a-script">4.8.1.3. From a script</a></li>
 | ||
| <li><a class="reference internal" href="#from-file-associations">4.8.1.4. From file associations</a></li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| <li><a class="reference internal" href="#shebang-lines">4.8.2. Shebang Lines</a></li>
 | ||
| <li><a class="reference internal" href="#arguments-in-shebang-lines">4.8.3. Arguments in shebang lines</a></li>
 | ||
| <li><a class="reference internal" href="#customization">4.8.4. Customization</a><ul>
 | ||
| <li><a class="reference internal" href="#customization-via-ini-files">4.8.4.1. Customization via INI files</a></li>
 | ||
| <li><a class="reference internal" href="#customizing-default-python-versions">4.8.4.2. Customizing default Python versions</a></li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| <li><a class="reference internal" href="#diagnostics">4.8.5. Diagnostics</a></li>
 | ||
| <li><a class="reference internal" href="#dry-run">4.8.6. Dry Run</a></li>
 | ||
| <li><a class="reference internal" href="#install-on-demand">4.8.7. Install on demand</a></li>
 | ||
| <li><a class="reference internal" href="#return-codes">4.8.8. Return codes</a></li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| <li><a class="reference internal" href="#finding-modules">4.9. Finding modules</a></li>
 | ||
| <li><a class="reference internal" href="#additional-modules">4.10. Additional modules</a><ul>
 | ||
| <li><a class="reference internal" href="#pywin32">4.10.1. PyWin32</a></li>
 | ||
| <li><a class="reference internal" href="#cx-freeze">4.10.2. cx_Freeze</a></li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| <li><a class="reference internal" href="#compiling-python-on-windows">4.11. Compiling Python on Windows</a></li>
 | ||
| <li><a class="reference internal" href="#other-platforms">4.12. Other Platforms</a></li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| </ul>
 | ||
| 
 | ||
|   </div>
 | ||
|   <div>
 | ||
|     <h4>Previous topic</h4>
 | ||
|     <p class="topless"><a href="configure.html"
 | ||
|                           title="previous chapter"><span class="section-number">3. </span>Configure Python</a></p>
 | ||
|   </div>
 | ||
|   <div>
 | ||
|     <h4>Next topic</h4>
 | ||
|     <p class="topless"><a href="mac.html"
 | ||
|                           title="next chapter"><span class="section-number">5. </span>Using Python on macOS</a></p>
 | ||
|   </div>
 | ||
|   <div role="note" aria-label="source link">
 | ||
|     <h3>This Page</h3>
 | ||
|     <ul class="this-page-menu">
 | ||
|       <li><a href="../bugs.html">Report a Bug</a></li>
 | ||
|       <li>
 | ||
|         <a href="https://github.com/python/cpython/blob/main/Doc/using/windows.rst"
 | ||
|             rel="nofollow">Show Source
 | ||
|         </a>
 | ||
|       </li>
 | ||
|     </ul>
 | ||
|   </div>
 | ||
|         </div>
 | ||
| <div id="sidebarbutton" title="Collapse sidebar">
 | ||
| <span>«</span>
 | ||
| </div>
 | ||
| 
 | ||
|       </div>
 | ||
|       <div class="clearer"></div>
 | ||
|     </div>  
 | ||
|     <div class="related" role="navigation" aria-label="Related">
 | ||
|       <h3>Navigation</h3>
 | ||
|       <ul>
 | ||
|         <li class="right" style="margin-right: 10px">
 | ||
|           <a href="../genindex.html" title="General Index"
 | ||
|              >index</a></li>
 | ||
|         <li class="right" >
 | ||
|           <a href="../py-modindex.html" title="Python Module Index"
 | ||
|              >modules</a> |</li>
 | ||
|         <li class="right" >
 | ||
|           <a href="mac.html" title="5. Using Python on macOS"
 | ||
|              >next</a> |</li>
 | ||
|         <li class="right" >
 | ||
|           <a href="configure.html" title="3. Configure Python"
 | ||
|              >previous</a> |</li>
 | ||
| 
 | ||
|           <li><img src="../_static/py.svg" alt="Python logo" style="vertical-align: middle; margin-top: -1px"/></li>
 | ||
|           <li><a href="https://www.python.org/">Python</a> »</li>
 | ||
|           <li class="switchers">
 | ||
|             <div class="language_switcher_placeholder"></div>
 | ||
|             <div class="version_switcher_placeholder"></div>
 | ||
|           </li>
 | ||
|           <li>
 | ||
|               
 | ||
|           </li>
 | ||
|     <li id="cpython-language-and-version">
 | ||
|       <a href="../index.html">3.13.3 Documentation</a> »
 | ||
|     </li>
 | ||
| 
 | ||
|           <li class="nav-item nav-item-1"><a href="index.html" >Python Setup and Usage</a> »</li>
 | ||
|         <li class="nav-item nav-item-this"><a href=""><span class="section-number">4. </span>Using Python on Windows</a></li>
 | ||
|                 <li class="right">
 | ||
|                     
 | ||
| 
 | ||
|     <div class="inline-search" role="search">
 | ||
|         <form class="inline-search" action="../search.html" method="get">
 | ||
|           <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" id="search-box" />
 | ||
|           <input type="submit" value="Go" />
 | ||
|         </form>
 | ||
|     </div>
 | ||
|                      |
 | ||
|                 </li>
 | ||
|             <li class="right">
 | ||
| <label class="theme-selector-label">
 | ||
|     Theme
 | ||
|     <select class="theme-selector" oninput="activateTheme(this.value)">
 | ||
|         <option value="auto" selected>Auto</option>
 | ||
|         <option value="light">Light</option>
 | ||
|         <option value="dark">Dark</option>
 | ||
|     </select>
 | ||
| </label> |</li>
 | ||
|             
 | ||
|       </ul>
 | ||
|     </div>  
 | ||
|     <div class="footer">
 | ||
|     © 
 | ||
|       <a href="../copyright.html">
 | ||
|     
 | ||
|     Copyright
 | ||
|     
 | ||
|       </a>
 | ||
|      2001-2025, Python Software Foundation.
 | ||
|     <br />
 | ||
|     This page is licensed under the Python Software Foundation License Version 2.
 | ||
|     <br />
 | ||
|     Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
 | ||
|     <br />
 | ||
|     
 | ||
|       See <a href="/license.html">History and License</a> for more information.<br />
 | ||
|     
 | ||
|     
 | ||
|     <br />
 | ||
| 
 | ||
|     The Python Software Foundation is a non-profit corporation.
 | ||
| <a href="https://www.python.org/psf/donations/">Please donate.</a>
 | ||
| <br />
 | ||
|     <br />
 | ||
|       Last updated on Apr 08, 2025 (14:33 UTC).
 | ||
|     
 | ||
|       <a href="/bugs.html">Found a bug</a>?
 | ||
|     
 | ||
|     <br />
 | ||
| 
 | ||
|     Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3.
 | ||
|     </div>
 | ||
| 
 | ||
|   </body>
 | ||
| </html> |