• Home
Name Date Size #Lines LOC

..--

bundle/03-May-2024-4,7423,729

core/03-May-2024-139125

dev/03-May-2024-120107

doc/03-May-2024-11597

exe/03-May-2024-274247

launcher/03-May-2024-194169

lib/03-May-2024-260229

path/03-May-2024-6757

pip/03-May-2024-6653

tcltk/03-May-2024-291263

test/03-May-2024-164142

tools/03-May-2024-8983

ucrt/03-May-2024-5045

README.txtD03-May-202422.4 KiB537403

build.batD03-May-20242.6 KiB8371

buildrelease.batD03-May-20249.4 KiB241208

common.wxsD03-May-20244.8 KiB137113

common_en-US.wxl_templateD03-May-20241.4 KiB1918

csv_to_wxs.pyD03-May-20244.9 KiB128103

generate_md5.pyD03-May-2024679 2820

get_externals.batD03-May-20242.7 KiB9275

make_appx.ps1D03-May-20242.2 KiB7245

make_cat.ps1D03-May-20241.4 KiB4623

make_zip.projD03-May-20241.9 KiB4134

msi.propsD03-May-20249.1 KiB187158

msi.targetsD03-May-20245.7 KiB9379

purge.pyD03-May-20241.9 KiB7965

sdktools.psm1D03-May-20241.5 KiB4941

sign_build.ps1D03-May-20241 KiB3416

testrelease.batD03-May-20244.1 KiB11897

uploadrelease.batD03-May-20245 KiB11098

uploadrelease.projD03-May-20246.7 KiB11499

uploadrelease.ps1D03-May-20245.3 KiB172117

wix.propsD03-May-2024966 1211

README.txt

1Quick Build Info
2================
3
4For testing, the installer should be built with the Tools/msi/build.bat
5script:
6
7    build.bat [-x86] [-x64] [--doc]
8
9For an official release, the installer should be built with the
10Tools/msi/buildrelease.bat script and environment variables:
11
12    set PYTHON=<path to Python 2.7 or 3.4>
13    set SPHINXBUILD=<path to sphinx-build.exe>
14    set PATH=<path to Git (git.exe)>;
15             <path to HTML Help Compiler (hhc.exe)>;%PATH%
16
17    buildrelease.bat [-x86] [-x64] [-D] [-B]
18        [-o <output directory>] [-c <certificate name>]
19
20See the Building the Installer section for more information.
21
22Overview
23========
24
25Python is distributed on Windows as an installer that will configure the
26user's system. This allows users to have a functioning copy of Python
27without having to build it themselves.
28
29The main tasks of the installer are:
30
31* copy required files into the expected layout
32* configure system settings so the installation can be located by
33  other programs
34* add entry points for modifying, repairing and uninstalling Python
35* make it easy to launch Python, its documentation, and IDLE
36
37Each of these is discussed in a later section of this document.
38
39Structure of the Installer
40==========================
41
42The installer is structured as a 'layout', which consists of a number of
43CAB and MSI files and a single EXE.
44
45The EXE is the main entry point into the installer. It contains the UI
46and command-line logic, as well as the ability to locate and optionally
47download other parts of the layout.
48
49Each MSI contains the logic required to install a component or feature
50of Python. These MSIs should not be launched directly by users. MSIs can
51be embedded into the EXE or automatically downloaded as needed.
52
53Each CAB contains the files making up a Python installation. CABs are
54embedded into their associated MSI and are never seen by users.
55
56MSIs are only required when the related feature or component is being
57installed. When components are not selected for installation, the
58associated MSI is not downloaded. This allows the installer to offer
59options to install debugging symbols and binaries without increasing
60the initial download size by separating them into their own MSIs.
61
62Building the Installer
63======================
64
65Before building the installer, download extra build dependencies using
66Tools\msi\get_externals.bat. (Note that this is in addition to the
67similarly named file in PCbuild.)
68
69One of the dependencies used in builds is WiX, a toolset that lets developers
70create installers for Windows Installer, the Windows installation engine. WiX
71has a dependency on the Microsoft .NET Framework Version 3.5 (which may not be
72configured on recent versions of Windows, such as Windows 10). If you are
73building on a recent Windows version, use the Control Panel (Programs | Programs
74and Features | Turn Windows Features on or off) and ensure that the entry
75".NET Framework 3.5 (includes .NET 2.0 and 3.0)" is enabled.
76
77For testing, the installer should be built with the Tools/msi/build.bat
78script:
79
80    build.bat [-x86] [-x64] [--doc] [--test-marker] [--pack]
81
82This script will build the required configurations of Python and
83generate an installer layout in PCbuild/(win32|amd64)/en-us.
84
85Specify -x86 and/or -x64 to build for each platform. If neither is
86specified, both platforms will be built. Currently, both the debug and
87release versions of Python are required for the installer.
88
89Specify --doc to build the documentation (.chm) file. If the file is not
90available, it will simply be excluded from the installer. Ensure
91%PYTHON% and %SPHINXBUILD% are set when passing this option. You may
92also set %HTMLHELP% to the Html Help Compiler (hhc.exe), or put HHC on
93your PATH or in externals/.
94
95Specify --test-marker to build an installer that works side-by-side with
96an official Python release. All registry keys and install locations will
97include an extra marker to avoid overwriting files. This marker is
98currently an 'x' prefix, but may change at any time.
99
100Specify --pack to build an installer that does not require all MSIs to
101be available alongside. This takes longer, but is easier to share.
102
103
104For an official release, the installer should be built with the
105Tools/msi/buildrelease.bat script:
106
107    set PYTHON=<path to Python 2.7 or 3.4>
108    set SPHINXBUILD=<path to sphinx-build.exe>
109    set PATH=<path to Git (git.exe)>;
110             <path to HTML Help Compiler (hhc.exe)>;%PATH%
111
112    buildrelease.bat [-x86] [-x64] [-D] [-B]
113        [-o <output directory>] [-c <certificate name>]
114
115Specify -x86 and/or -x64 to build for each platform. If neither is
116specified, both platforms will be built. Currently, both the debug and
117release versions of Python are required for the installer.
118
119Specify -D to skip rebuilding the documentation. The documentation is
120required for a release and the build will fail if it is not available.
121
122Specify -B to skip rebuilding Python. This is useful to only rebuild the
123installer layout after a previous call to buildrelease.bat.
124
125Specify -o to set an output directory. The installer layouts will be
126copied to platform-specific subdirectories of this path.
127
128Specify -c to choose a code-signing certificate to be used for all the
129signable binaries in Python as well as each file making up the
130installer. Official releases of Python must be signed.
131
132Ensure %PYTHON% and %SPHINXBUILD% are set when passing this option. You
133may also set %HTMLHELP% to the Html Help Compiler (hhc.exe), or put HHC
134on your PATH or in externals/. You will also need Git (git.exe) on
135your PATH.
136
137If WiX is not found on your system, it will be automatically downloaded
138and extracted to the externals/ directory.
139
140To manually build layouts of the installer, build one of the projects in
141the bundle folder.
142
143    msbuild bundle\snapshot.wixproj
144    msbuild bundle\releaseweb.wixproj
145    msbuild bundle\releaselocal.wixproj
146    msbuild bundle\full.wixproj
147
148snapshot.wixproj produces a test installer versioned based on the date.
149
150releaseweb.wixproj produces a release installer that does not embed any
151of the layout.
152
153releaselocal.wixproj produces a release installer that embeds the files
154required for a default installation.
155
156full.wixproj produces a test installer that embeds the entire layout.
157
158The following properties may be passed when building these projects.
159
160  /p:BuildForRelease=(true|false)
161    When true, adds extra verification to ensure a complete installer is
162    produced. Defaults to false.
163
164  /p:ReleaseUri=(any URI)
165    Used to generate unique IDs for the installers to allow side-by-side
166    installation. Forks of Python can use the same installer infrastructure
167    by providing a unique URI for this property. It does not need to be an
168    active internet address. Defaults to $(ComputerName).
169
170    Official releases use https://www.python.org/(architecture name)
171
172  /p:DownloadUrlBase=(any URI)
173    Specifies the base of a URL where missing parts of the installer layout
174    can be downloaded from. The build version and architecture will be
175    appended to create the full address. If omitted, missing components will
176    not be automatically downloaded.
177
178  /p:DownloadUrl=(any URI)
179    Specifies the full URL where missing parts of the installer layout can
180    be downloaded from. Should normally include '{2}', which will be
181    substituted for the filename. If omitted, missing components will not be
182    automatically downloaded. If specified, this value overrides
183    DownloadUrlBase.
184
185  /p:SigningCertificate=(certificate name)
186    Specifies the certificate to sign the installer layout with. If omitted,
187    the layout will not be signed.
188
189  /p:RebuildAll=(true|false)
190    When true, rebuilds all of the MSIs making up the layout. Defaults to
191    true.
192
193Uploading the Installer
194=======================
195
196For official releases, the uploadrelease.bat script should be used.
197
198You will require PuTTY so that plink.exe and pscp.exe can be used, and your
199SSH key can be activated in pageant.exe. PuTTY should be either on your path
200or in %ProgramFiles(x86)%\PuTTY.
201
202To include signatures for each uploaded file, you will need gpg2.exe on your
203path or have run get_externals.bat. You may also need to "gpg2.exe --import"
204your key before running the upload script.
205
206    uploadrelease.bat --host <host> --user <username> [--dry-run] [--no-gpg]
207
208The host is the URL to the server. This can be provided by the Release
209Manager. You should be able to SSH to this address.
210
211The username is your own username, which you have permission to SSH into
212the server containing downloads.
213
214Use --dry-run to display the generated upload commands without executing
215them. Signatures for each file will be generated but not uploaded unless
216--no-gpg is also passed.
217
218Use --no-gpg to suppress signature generation and upload.
219
220The default target directory (which appears in uploadrelease.proj) is
221correct for official Python releases, but may be overridden with
222--target <path> for other purposes. This path should generally not include
223any version specifier, as that will be added automatically.
224
225Modifying the Installer
226=======================
227
228The code for the installer is divided into three main groups: packages,
229the bundle and the bootstrap application.
230
231Packages
232--------
233
234Packages appear as subdirectories of Tools/msi (other than the bundle/
235directory). The project file is a .wixproj and the build output is a
236single MSI. Packages are built with the WiX Toolset. Some project files
237share source files and use preprocessor directives to enable particular
238features. These are typically used to keep the sources close when the
239files are related, but produce multiple independent packages.
240
241A package is the smallest element that may be independently installed or
242uninstalled (as used in this installer). For example, the test suite has
243its own package, as users can choose to add or remove it after the
244initial installation.
245
246All the files installed by a single package should be related, though
247some packages may not install any files. For example, the pip package
248executes the ensurepip package, but does not add or remove any of its
249own files. (It is represented as a package because of its
250installed/uninstalled nature, as opposed to the "precompile standard
251library" option, for example.) Dependencies between packages are handled
252by the bundle, but packages should detect when dependencies are missing
253and raise an error.
254
255Packages that include a lot of files may use an InstallFiles element in
256the .wixproj file to generate sources. See lib/lib.wixproj for an
257example, and msi.targets and csv_to_wxs.py for the implementation. This
258element is also responsible for generating the code for cleaning up and
259removing __pycache__ folders in any directory containing .py files.
260
261All packages are built with the Tools/msi/common.wxs file, and so any
262directory or property in this file may be referenced. Of particular
263interest:
264
265  REGISTRYKEY (property)
266    The registry key for the current installation.
267
268  InstallDirectory (directory)
269    The root install directory for the current installation. Subdirectories
270    are also specified in this file (DLLs, Lib, etc.)
271
272  MenuDir (directory)
273    The Start Menu folder for the current installation.
274
275  UpgradeTable (property)
276    Every package should reference this property to include upgrade
277    information.
278
279  OptionalFeature (Component)
280    Packages that may be enabled or disabled should reference this component
281    and have an OPTIONAL_FEATURES entry in the bootstrap application to
282    properly handle Modify and Upgrade.
283
284The .wxl_template file is specially handled by the build system for this
285project to perform {{substitutions}} as defined in msi.targets. They
286should be included in projects as <WxlTemplate> items, where .wxl files
287are normally included as <EmbeddedResource> items.
288
289Bundle
290------
291
292The bundle is compiled to the main EXE entry point that for most users
293will represent the Python installer. It is built from Tools/msi/bundle
294with packages references in Tools/msi/bundle/packagegroups.
295
296Build logic for the bundle is in bundle.targets, but should be invoked
297through one of the .wixproj files as described in Building the
298Installer.
299
300The UI is separated between Default.thm (UI layout), Default.wxl
301(strings), bundle.wxs (properties) and the bootstrap application.
302Bundle.wxs also contains the chain, which is the list of packages to
303install and the order they should be installed in. These refer to named
304package groups in bundle/packagegroups.
305
306Each package group specifies one or more packages to install. Most
307packages require two separate entries to support both per-user and
308all-users installations. Because these reuse the same package, it does
309not increase the overall size of the package.
310
311Package groups refer to payload groups, which allow better control over
312embedding and downloading files than the default settings. Whether files
313are embedded and where they are downloaded from depends on settings
314created by the project files.
315
316Package references can include install conditions that determine when to
317install the package. When a package is a dependency for others, the
318condition should be crafted to ensure it is installed.
319
320MSI packages are installed or uninstalled based on their current state
321and the install condition. This makes them most suitable for features
322that are clearly present or absent from the user's machine.
323
324EXE packages are executed based on a customisable condition that can be
325omitted. This makes them suitable for pre- or post-install tasks that
326need to run regardless of whether features have been added or removed.
327
328Bootstrap Application
329---------------------
330
331The bootstrap application is a C++ application that controls the UI and
332installation. While it does not directly compile into the main EXE of
333the installer, it forms the main active component. Most of the
334installation functionality is provided by WiX, and so the bootstrap
335application is predominantly responsible for the code behind the UI that
336is defined in the Default.thm file. The bootstrap application code is in
337bundle/bootstrap and is built automatically when building the bundle.
338
339Installation Layout
340===================
341
342There are two installation layouts for Python on Windows, with the only
343differences being supporting files. A layout is selected implicitly
344based on whether the install is for all users of the machine or just for
345the user performing the installation.
346
347The default installation location when installing for all users is
348"%ProgramFiles%\Python3X" for the 64-bit interpreter and
349"%ProgramFiles(x86)%\Python3X-32" for the 32-bit interpreter. (Note that
350the latter path is equivalent to "%ProgramFiles%\Python3X-32" when
351running a 32-bit version of Windows.) This location requires
352administrative privileges to install or later modify the installation.
353
354The default installation location when installing for the current user
355is "%LocalAppData%\Programs\Python\Python3X" for the 64-bit interpreter
356and "%LocalAppData%\Programs\Python\Python3X-32" for the 32-bit
357interpreter. Only the current user can access this location. This
358provides a suitable level of protection against malicious modification
359of Python's files.
360
361(Default installation locations are set in Tools\msi\bundle\bundle.wxs.)
362
363Within this install directory is the following approximate layout:
364
365.\python[w].exe The core executable files
366.\python3x.dll  The core interpreter
367.\python3.dll   The stable ABI reference
368.\DLLs          Stdlib extensions (*.pyd) and dependencies
369.\Doc           Documentation (*.chm)
370.\include       Development headers (*.h)
371.\Lib           Standard library
372.\Lib\test      Test suite
373.\libs          Development libraries (*.lib)
374.\Scripts       Launcher scripts (*.exe, *.py)
375.\tcl           Tcl dependencies (*.dll, *.tcl and others)
376.\Tools         Tool scripts (*.py)
377
378When installed for all users, the following files are installed to
379"%SystemRoot%" (typically "C:\Windows") to ensure they are always
380available on PATH. (See Launching Python below.) For the current user,
381they are installed in "%LocalAppData%\Programs\Python\PyLauncher".
382
383.\py[w].exe         PEP 397 launcher
384
385
386System Settings
387===============
388
389On installation, registry keys are created so that other applications
390can locate and identify installations of Python. The locations of these
391keys vary based on the install type.
392
393For 64-bit interpreters installed for all users, the root key is:
394    HKEY_LOCAL_MACHINE\Software\Python\PythonCore\3.X
395
396For 32-bit interpreters installed for all users on a 64-bit operating
397system, the root key is:
398    HKEY_LOCAL_MACHINE\Software\Wow6432Node\Python\PythonCore\3.X-32
399
400For 32-bit interpreters installed for all users on a 32-bit operating
401system, the root key is:
402    HKEY_LOCAL_MACHINE\Software\Python\PythonCore\3.X-32
403
404For 64-bit interpreters installed for the current user:
405    HKEY_CURRENT_USER\Software\Python\PythonCore\3.X
406
407For 32-bit interpreters installed for the current user:
408    HKEY_CURRENT_USER\Software\Python\PythonCore\3.X-32
409
410When the core Python executables are installed, a key "InstallPath" is
411created within the root key with its default value set to the
412executable's install directory. A value named "ExecutablePath" is added
413with the full path to the main Python interpreter, and a key
414"InstallGroup" is created with its default value set to the product
415name "Python 3.X".
416
417When the Python standard library is installed, a key "PythonPath" is
418created within the root key with its default value set to the full path
419to the Lib folder followed by the path to the DLLs folder, separated by
420a semicolon.
421
422When the documentation is installed, a key "Help" is created within the
423root key, with a subkey "Main Python Documentation" with its default
424value set to the full path to the installed CHM file.
425
426
427The py.exe launcher is installed as part of a regular Python install,
428but using a separate mechanism that allows it to more easily span
429versions of Python. As a result, it has different root keys for its
430registry entries:
431
432When installed for all users on a 64-bit operating system, the
433launcher's root key is:
434    HKEY_LOCAL_MACHINE\Software\Wow6432Node\Python\Launcher
435
436When installed for all users on a 32-bit operating system, the
437launcher's root key is:
438    HKEY_LOCAL_MACHINE\Software\Python\Launcher
439
440When installed for the current user:
441    HKEY_CURRENT_USER\Software\Python\Launcher
442
443When the launcher is installed, a key "InstallPath" is created within
444its root key with its default value set to the launcher's install
445directory. File associations are also created for .py, .pyw, .pyc and
446.pyo files.
447
448Launching Python
449================
450
451When a feature offering user entry points in the Start Menu is
452installed, a folder "Python 3.X" is created. Every shortcut should be
453created within this folder, and each shortcut should include the version
454and platform to allow users to identify the shortcut in a search results
455page.
456
457The core Python executables creates a shortcut "Python 3.X (32-bit)" or
458"Python 3.X (64-bit)" depending on the interpreter.
459
460The documentation creates a shortcut "Python 3.X 32-bit Manuals" or
461"Python 3.X 64-bit Manuals". The documentation is identical for all
462platforms, but the shortcuts need to be separate to avoid uninstallation
463conflicts.
464
465Installing IDLE creates a shortcut "IDLE (Python 3.X 32-bit)" or "IDLE
466(Python 3.X 64-bit)" depending on the interpreter.
467
468
469For users who often launch Python from a Command Prompt, an option is
470provided to add the directory containing python.exe to the user or
471system PATH variable. If the option is selected, the install directory
472and the Scripts directory will be added at the start of the system PATH
473for an all users install and the user PATH for a per-user install.
474
475When the user only has one version of Python installed, this will behave
476as expected. However, because Windows searches the system PATH before
477the user PATH, users cannot override a system-wide installation of
478Python on their PATH. Further, because the installer can only prepend to
479the path, later installations of Python will take precedence over
480earlier installations, regardless of interpreter version.
481
482Because it is not possible to automatically create a sensible PATH
483configuration, users are recommended to use the py.exe launcher and
484manually modify their PATH variable to add Scripts directories in their
485preferred order. System-wide installations of Python should consider not
486modifying PATH, or using an alternative technology to modify their
487users' PATH variables.
488
489
490The py.exe launcher is recommended because it uses a consistent and
491sensible search order for Python installations. User installations are
492preferred over system-wide installs, and later versions are preferred
493regardless of installation order (with the exception that py.exe
494currently prefers 2.x versions over 3.x versions without the -3 command
495line argument).
496
497For both 32-bit and 64-bit interpreters, the 32-bit version of the
498launcher is installed. This ensures that the search order is always
499consistent (as the 64-bit launcher is subtly different from the 32-bit
500launcher) and also avoids the need to install it multiple times. Future
501versions of Python will upgrade the launcher in-place, using Windows
502Installer's upgrade functionality to avoid conflicts with earlier
503installed versions.
504
505When installed, file associations are created for .py, .pyc and .pyo
506files to launch with py.exe and .pyw files to launch with pyw.exe. This
507makes Python files respect shebang lines by default and also avoids
508conflicts between multiple Python installations.
509
510
511Repair, Modify and Uninstall
512============================
513
514After installation, Python may be modified, repaired or uninstalled by
515running the original EXE again or via the Programs and Features applet
516(formerly known as Add or Remove Programs).
517
518Modifications allow features to be added or removed. The install
519directory and kind (all users/single user) cannot be modified. Because
520Windows Installer caches installation packages, removing features will
521not require internet access unless the package cache has been corrupted
522or deleted. Adding features that were not previously installed and are
523not embedded or otherwise available will require internet access.
524
525Repairing will rerun the installation for all currently installed
526features, restoring files and registry keys that have been modified or
527removed. This operation generally will not redownload any files unless
528the cached packages have been corrupted or deleted.
529
530Removing Python will clean up all the files and registry keys that were
531created by the installer, as well as __pycache__ folders that are
532explicitly handled by the installer. Python packages installed later
533using a tool like pip will not be removed. Some components may be
534installed by other installers and these will not be removed if another
535product has a dependency on them.
536
537