A remarkably powerful dynamic programming language

Python for Mac

Python 3.10.8

  -  39 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.10.8.


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.10.8 Screenshots

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

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

What's new in this version:

Security:
- Fix multiplying a list by an integer (list *= int): detect the integer overflow when the new allocated length is close to the maximum size. Issue reported by Jordan Limor. Patch by Victor Stinner
- Fix a shell code injection vulnerability in the get-remote-certificate.py example script. The script no longer uses a shell to run openssl commands. Issue reported and initial fix by Caleb Shortt. Patch by Victor Stinner
- The deprecated mailcap module now refuses to inject unsafe text (filenames, MIME types, parameters) into shell commands. Instead of using such text, it will warn and act as if a match was not found (or for test commands, as if the test failed)

Core and Builtins:
- os.sched_yield() now release the GIL while calling sched_yield(2). Patch by Dong-hee Na
- Bugfix: PyFunction_GetAnnotations() should return a borrowed reference. It was returning a new reference
- Fixed a missing incref/decref pair in Exception.__setstate__(). Patch by Ofey Chan
- Fix command line parsing: reject -X int_max_str_digits option with no value (invalid) when the PYTHONINTMAXSTRDIGITS environment variable is set to a valid limit. Patch by Victor Stinner
- Fix overly-broad source position information for chained comparisons used as branching conditions
- Fix undefined behaviour in _testcapimodule.c
- When ValueError is raised if an integer is larger than the limit, mention the sys.set_int_max_str_digits() function in the error message. Patch by Victor Stinner
- At Python exit, sometimes a thread holding the GIL can wait forever for a thread (usually a daemon thread) which requested to drop the GIL, whereas the thread already exited. To fix the race condition, the thread which requested the GIL drop now resets its request before exiting. Issue discovered and analyzed by Mingliang ZHAO. Patch by Victor Stinner
- Fix a possible assertion failure, fatal error, or SystemError if a line tracing event raises an exception while opcode tracing is enabled
- Fix undefined behaviour in C code of null pointer arithmetic
- Do not expose KeyWrapper in _functools
- When loading a file with invalid UTF-8 inside a multi-line string, a correct SyntaxError is emitted
- Disable incorrect pickling of the C implemented classmethod descriptors
- Fix AttributeError missing name and obj attributes in object.__getattribute__(). Patch by Philip Georgi
- bpo-42316: Document some places where an assignment expression needs parentheses.

Library:
- Wrap network errors consistently in urllib FTP support, so the test suite doesn’t fail when a network is available but the public internet is not reachable
- Fixes AttributeError when subprocess.check_output() is used with argument input=None and either of the arguments encoding or errors are used
- Avoid spurious tracebacks from asyncio when default executor cleanup is delayed until after the event loop is closed (e.g. as the result of a keyboard interrupt)
- Avoid a crash in the C version of asyncio.Future.remove_done_callback() when an evil argument is passed
- Remove tokenize.NL check from tabnanny
- Make Semaphore run faster
- Fix generation of the default name of tkinter.Checkbutton. Previously, checkbuttons in different parent widgets could have the same short name and share the same state if arguments “name” and “variable” are not specified. Now they are globally unique
- Update bundled libexpat to 2.4.
- Fix race condition in asyncio where process_exited() called before the pipe_data_received() leading to inconsistent output. Patch by Kumar Aditya
- Fixed check in multiprocessing.resource_tracker that guarantees that the length of a write to a pipe is not greater than PIPE_BUF
- Corrected type annotation for dataclass attribute pstats.FunctionProfile.ncalls to be str
- Fix the faulthandler implementation of faulthandler.register(signal, chain=True) if the sigaction() function is not available: don’t call the previous signal handler if it’s NULL. Patch by Victor Stinner
- In inspect, fix overeager replacement of “typing.” in formatting annotations
- Fix asyncio.streams.StreamReaderProtocol to keep a strong reference to the created task, so that it’s not garbage collecte
- Fix handling compiler warnings (SyntaxWarning and DeprecationWarning) in codeop.compile_command() when checking for incomplete input. Previously it emitted warnings and raised a SyntaxError. Now it always returns None for incomplete input without emitting any warnings
- Fixed flickering of the turtle window when the tracer is turned off. Patch by Shin-myoung-serp
- Allow asyncio.StreamWriter.drain() to be awaited concurrently by multiple tasks. Patch by Kumar Aditya
- Fix broken asyncio.Semaphore when acquire is cancelled
- Fix ast.unparse() when ImportFrom.level is Non
- Improve performance of urllib.request.getproxies_environment when there are many environment variable

Documentation:
- Fix ! in c domain ref target syntax via a conf.py patch, so it works as intended to disable ref target resolution
- Clarified the conflicting advice given in the ast documentation about ast.literal_eval() being “safe” for use on untrusted input while at the same time warning that it can crash the process. The latter statement is true and is deemed unfixable without a large amount of work unsuitable for a bugfix. So we keep the warning and no longer claim that literal_eval is safe
- Update tutorial introduction output to use 3.10+ SyntaxError invalid range

Build:
- Ensure that Windows releases built with Tools\msi\buildrelease.bat are upgradable to and from official Python releases

Windows:
- Fix possible crashes caused by the use of uninitialized variables when pass invalid arguments in os.system() on Windows and in Windows-specific modules (like winreg)
- Clarify some text in the Windows installer
- Fixes a potential buffer overrun in msilib