Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Drop python 3.4 & 3.5 support #2246

Merged
merged 3 commits into from
Aug 1, 2023
Merged

Conversation

mayeut
Copy link
Contributor

@mayeut mayeut commented Apr 22, 2023

Summary

  • OS: all
  • Bug fix: no
  • Type: core

Description

Python 3.4 & 3.5 are currently untested in CI (c.f. #2162 & #2102 (comment))

Given the download count for last week below, I propose to just drop support for those versions.

psutil % pypinfo -l 25 --percent -sd -8 'psutil==5.9.*' pyversion
Served from cache: False
Data processed: 691.93 MiB
Data billed: 692.00 MiB
Estimated cost: $0.01

| python_version | percent | download_count |
| -------------- | ------- | -------------- |
| 3.8            |  38.26% |      5,134,737 |
| 3.7            |  31.19% |      4,186,332 |
| 3.9            |  10.86% |      1,456,900 |
| 3.10           |   9.75% |      1,309,074 |
| 3.6            |   6.60% |        885,766 |
| 3.11           |   2.22% |        298,476 |
| 2.7            |   1.05% |        140,466 |
| 3.5            |   0.06% |          7,460 |
| 3.12           |   0.01% |            688 |
| 3.4            |   0.00% |            371 |
| Total          |         |     13,420,270 |

@mayeut mayeut changed the title Drop python 3.4 & 3.5 Drop python 3.4 & 3.5 support Apr 22, 2023
@giampaolo
Copy link
Owner

Mmm. This should be part of a major release. Let's merge this for psutil 6.0.0, where I will also introduce some other (not serious) incompatibilities.

@mayeut
Copy link
Contributor Author

mayeut commented Apr 23, 2023

IMHO, it could also be part of a minor version bump like it was when dropping 2.6. Obviously it depends on the plans you have for minor vs major release.
If you have plans for a 6.0, it might be time to consider dropping 2.7 ?
It still has many downloads but python 2.7 has now been EOL for more than 3 years. It might also depend on what kind of commitment you have w.r.t. Tidelift support ?

@@ -28,7 +28,7 @@
from . import _psutil_osx


if sys.version_info >= (3, 4):
if sys.version_info[0] >= 3:
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please use PY3 constant instead.

@@ -53,7 +53,7 @@
from ._compat import basestring


if sys.version_info >= (3, 4):
if sys.version_info[0] >= 3:
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please use PY3 constant instead.

@@ -56,7 +56,7 @@
else:
raise

if sys.version_info >= (3, 4):
if sys.version_info[0] >= 3:
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please use PY3 constant instead.

@@ -67,7 +67,7 @@
warnings.simplefilter("ignore")
import mock # NOQA - requires "pip install mock"

if sys.version_info >= (3, 4):
if sys.version_info[0] >= 3:
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please use PY3 constant instead.

@@ -723,7 +723,7 @@ def nice(self, ret, info):
priorities = [getattr(psutil, x) for x in dir(psutil)
if x.endswith('_PRIORITY_CLASS')]
self.assertIn(ret, priorities)
if sys.version_info > (3, 4):
if sys.version_info[0] >= 3:
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please use PY3 constant instead.

@@ -751,7 +751,7 @@ def test_net_if_addrs(self):
self.assertIsInstance(addr.netmask, (str, type(None)))
self.assertIsInstance(addr.broadcast, (str, type(None)))
self.assertIn(addr.family, families)
if sys.version_info >= (3, 4) and not PYPY:
if sys.version_info[0] >= 3 and not PYPY:
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ditto.

mayeut added 3 commits July 31, 2023 09:31
Signed-off-by: mayeut <mayeut@users.noreply.github.com>
Signed-off-by: mayeut <mayeut@users.noreply.github.com>
Signed-off-by: mayeut <mayeut@users.noreply.github.com>
@mayeut mayeut force-pushed the drop-python-3.5 branch from 380357b to 44d5b64 Compare July 31, 2023 19:10
@giampaolo giampaolo merged commit 252b6fd into giampaolo:master Aug 1, 2023
giampaolo added a commit that referenced this pull request Aug 1, 2023
@mayeut mayeut deleted the drop-python-3.5 branch August 1, 2023 06:18
giampaolo added a commit that referenced this pull request Dec 20, 2024
About dropping Python 2.7 support, 3 years ago [I stated](#2014 (comment)):

>  [...] not a chance, for many years to come. [Python 2.7] currently represents 7-10% of total downloads, aka around 70k /100k downloads per day

3 years later (and to my surprise) **downloads for Python 2.7 dropped to 0.36%**. These are downloads per month:

```
$ pypinfo --percent psutil pyversion
Served from cache: False
Data processed: 4.65 GiB
Data billed: 4.65 GiB
Estimated cost: $0.03

| python_version | percent | download_count |
| -------------- | ------- | -------------- |
| 3.10           |  23.84% |     26,354,506 |
| 3.8            |  18.87% |     20,862,015 |
| 3.7            |  17.38% |     19,217,960 |
| 3.9            |  17.00% |     18,798,843 |
| 3.11           |  13.63% |     15,066,706 |
| 3.12           |   7.01% |      7,754,751 |
| 3.13           |   1.15% |      1,267,008 |
| 3.6            |   0.73% |        803,189 |
| 2.7            |   0.36% |        402,111 |
| 3.5            |   0.03% |         28,656 |
| Total          |         |    110,555,745 |
```

According to [pypistats.org](https://archive.is/wip/knzql) it's 0.28% of the total, and around 15.000 downloads per day.

Maintaining 2.7 support has become increasingly difficult, but still possible. E.g. we can still run tests by using [old PYPI backports](https://github.com/giampaolo/psutil/blob/fbb6d9ce98f930d3d101b7df5a4f4d0f1d2b35a3/setup.py#L76-L85). GitHub Actions can still be [tweaked](https://github.com/giampaolo/psutil/blob/fbb6d9ce98f930d3d101b7df5a4f4d0f1d2b35a3/.github/workflows/build.yml#L77-L112) to run tests and produce wheels on Linux and macOS. Not Windows though, for which we have to use a separate service (Appveyor). 

Still, the amount of hacks in psutil source code necessary to support Python 2.7 piled up over the years, and became quite big. Some disadvantages that come to mind:

* (high) having to maintain various python compatibility layers (e.g. [psutil/_compat.py](https://github.com/giampaolo/psutil/blob/fbb6d9ce98f930d3d101b7df5a4f4d0f1d2b35a3/psutil/_compat.py#L1)) + all the compromises that come with it (extra imports, extra code, str vs. unicode differences, etc.)
* (medium) having to maintain a C compatibility layer (`#if PY_MAJOR_VERSION <= 3`, etc.)
* (medium) inability to use modern language features, especially f-strings
* (low) inability to freely use `enum`s, which creates a difference on how CONSTANTS are exposed in terms of API
* (medium) having to install a specific version of pip and other (outdated) [deps](https://github.com/giampaolo/psutil/blob/fbb6d9ce98f930d3d101b7df5a4f4d0f1d2b35a3/setup.py#L76-L85)
* (high) relying on third-party Appveyor CI service, just to run tests on python 2.7 and produce wheels, when we could rely on a single CI service instead (GitHub)
  * (high) soon I want to distribute wheels via GitHub instead of manually via `twine`, so that'll be a problem (CC @potiuk)
* (high) gradual lack of support from third-party libraries and services
* (medium) 4 extra CI jobs which are run on every commit (Linux, macOS, Windows 32-bit, Windows 64-bit) 
* (medium) the distribution of 7 wheels specific for Python 2.7. From last release: 
  * psutil-6.1.1-cp27-cp27m-macosx_10_9_x86_64.whl
  * psutil-6.1.1-cp27-none-win32.whl
  * psutil-6.1.1-cp27-none-win_amd64.whl
  * psutil-6.1.1-cp27-cp27m-manylinux2010_i686.whl                                                                          
  * psutil-6.1.1-cp27-cp27m-manylinux2010_x86_64.whl                                                                        
  * psutil-6.1.1-cp27-cp27mu-manylinux2010_i686.whl                                                                         
  * psutil-6.1.1-cp27-cp27mu-manylinux2010_x86_64.whl                                                                       
* etc. 

As such I decided to finally **drop support for Python 2.7**. Current psutil 6.1.1 release will still support Python 2.7, but next 7.0.0 will not. 

We can still make a promise that the 6.1.* line (EDIT: see [python2 branch](https://github.com/giampaolo/psutil/tree/python2)) will keep supporting Python 2.7 and will **receive critical bug-fixes only** (no new features).

In 7.0.0 we can keep the [setup.py](https://github.com/giampaolo/psutil/blob/fbb6d9ce98f930d3d101b7df5a4f4d0f1d2b35a3/setup.py) script compatible with Python 2.7 in terms of syntax, so that it can emit an informative error message on pip install. E.g. the user  will see something like this:

```
$ pip2 install psutil
As of version 7.0.0 psutil no longer supports Python 2.7. 
Latest version supporting Python 2.7 is psutil 6.1.X.  
Install it with: "pip2 install psutil==6.1.*".
```

Related tickets:
* 2017-06: #1053
* 2022-04: #2099
* 2023-04: #2246
* giampaolo/pyftpdlib#635
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants