A remarkably powerful dynamic programming language

Python for Mac

Python 3.9.5

  -  28.5 MB  -  Open Source

Sometimes latest versions of the software can cause issues when installed on older devices or devices running an older version of the operating system.

Software makers usually fix these issues but it can take them some time. What you can do in the meantime is to download and install an older version of Python 3.9.5.


For those interested in downloading the most recent release of Python for Mac or reading our review, simply click here.


All old versions distributed on our website are completely virus-free and available for download at no cost.


We would love to hear from you

If you have any questions or ideas that you want to share with us - head over to our Contact page and let us know. We value your feedback!

  • Python 3.9.5 Screenshots

    The images below have been resized. Click on them to view the screenshots in full size.

    Python 3.9.5 Screenshot 1
  • Python 3.9.5 Screenshot 2
  • Python 3.9.5 Screenshot 3
  • Python 3.9.5 Screenshot 4
  • Python 3.9.5 Screenshot 5

What's new in this version:

Security:
- Creating a sqlite3.Connection object now also produces a sqlite3.connect auditing event. Previously this event was only produced by sqlite3.connect() calls. Patch by Erlend E. Aasland.
- The presence of newline or tab characters in parts of a URL could allow some forms of attacks
- Following the controlling specification for URLs defined by WHATWG urllib.parse() now removes ASCII newlines and tabs from URLs, preventing such attacks
- Ensures interpreter-level audit hooks receive the cpython.PyInterpreterState_New event when called through the _xxsubinterpreters module
- ipaddress module no longer accepts any leading zeros in IPv4 address strings. Leading zeros are ambiguous and interpreted as octal notation by some libraries. For example the legacy function socket.inet_aton() treats leading zeros as octal notatation. glibc implementation of modern inet_pton() does not accept any leading zeros. For a while the ipaddress module used to accept ambiguous leading zeros.
- Fix Regular Expression Denial of Service (ReDoS) vulnerability in urllib.request.AbstractBasicAuthHandler. The ReDoS-vulnerable regex has quadratic worst-case complexity and it allows cause a denial of service when identifying crafted invalid RFCs. This ReDoS issue is on the client side and needs remote attackers to control the HTTP server.
- Audit hooks are now fired for frame.f_code, traceback.tb_frame, and generator code/frame attribute access

Core and Builtins:
- Importlib now resolves relative paths when creating module spec objects from file locations
- Fix bytearray repetition incorrectly copying data from the start of the buffer, even if the data is offset within the buffer (e.g. after reassigning a slice at the start of the bytearray to a shorter byte string).

Library:
- Update bundled pip to 21.1.1
- Fixed the turtle module working with non-default root window
- Update bundled pip to 21.1 and setuptools to 56.0.0
- OpenSSL 3.0.0: load_verify_locations() now returns a consistent error message when cadata contains no valid certificate
- urllib can now convert Windows paths with \? prefixes into URL paths
- platform.win32_ver derives the windows version from sys.getwindowsversion().platform_version which in turn derives the version from kernel32.dll (which can be of a different version than Windows itself). Therefore change the platform.win32_ver to determine the version using the platform module’s _syscmd_ver private function to return an accurate version.
- [Enum] ensure exceptions raised in _missing__ are released
- OpenSSL 3.0.0: define OPENSSL_API_COMPAT 1.1.1 to suppress deprecation warnings. Python requires OpenSSL 1.1.1 APIs
- Add ssl.OP_IGNORE_UNEXPECTED_EOF constants (OpenSSL 3.0.0)
- OpenSSL 3.0.0: Don’t call the password callback function a second time when first call has signaled an error condition
- The header files for ssl error codes are now OpenSSL version-specific. Exceptions will now show correct reason and library codes. The make_ssl_data.py script has been rewritten to use OpenSSL’s text file with error codes.
- tkinter dialog windows are now recognized as dialogs by window managers on macOS and X Window
- turtle.textinput() and turtle.numinput() create now a transient window working on behalf of the canvas window
- Fix problem with hostname_checks_common_name. OpenSSL does not copy hostflags from struct SSL_CTX to struct SSL
- Allow bytes separator argument in urllib.parse.parse_qs and urllib.parse.parse_qsl when parsing str query strings. Previously, this raised a TypeError.
- Fixed processing of a dataclass that inherits from a frozen dataclass with no fields. It is now correctly detected as an error
- Fix thread locks in zlib module may go wrong in rare case. Patch by Ma Lin
- Fix dataclasses with InitVars and replace(). Patch by Claudiu Popa
- Fix a regression in the handling of ctypes’ ctypes.c_wchar_p type: embedded null characters would cause a ValueError to be raised. Patch by Zackery Spytz

Documentation:
- The documentation on the PyContextVar C-API was clarified
- Update dataclasses documentation to express that FrozenInstanceError is derived from AttributeError
- Update documentation to reflect that unparenthesized lambda expressions can no longer be the expression part in an if clause in comprehensions and generator expressions since Python 3.9.
- Fixing the example code in Doc/extending/extending.rst to declare and initialize the pmodule variable to be of the right type

Tests:
- Fix test_logging.test_namer_rotator_inheritance() on Windows: use os.replace() rather than os.rename(). Patch by Victor Stinner
- Fix a race condition in the SMTP test of test_logging. Don’t close a file descriptor (socket) from a different thread while asyncore.loop() is polling the file descriptor. Patch by Victor Stinner.
- Tests multiple OpenSSL versions on GitHub Actions. Use ccache to speed up testing
- OpenSSL 3.0.0: Disable testing of legacy protocols TLS 1.0 and 1.1. Tests are failing with TLSV1_ALERT_INTERNAL_ERROR

Windows:
- Avoid raising errors from pathlib.Path.exists() when passed an invalid filename
- Fixed os.stat() failing on inaccessible directories with a trailing slash, rather than falling back to the parent directory’s metadata. This implicitly affected os.path.exists() and os.path.isdir().
- Fixed decoding of host names in socket.gethostbyaddr() and socket.gethostbyname_ex()
- Updated pegen regeneration script on Windows to find and use Python 3.8 or higher. Prior to this, pegen regeneration already required 3.8 or higher, but the script may have used lower versions of Python
- Actually updates Windows release to OpenSSL 1.1.1k. Earlier releases were mislabelled and actually included 1.1.1i again
- Upgrade Windows installer to use SQLite 3.35.5

IDLE:
- IDLE dialog windows are now recognized as dialogs by window managers on macOS and X Window