-
-
Notifications
You must be signed in to change notification settings - Fork 264
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 2.7 support #635
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
…sion supporting py 2
giampaolo
added a commit
to giampaolo/psutil
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
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Some re-implementation notes:
str.decode("utf8")
andunicode(path, 'utf8', 'ignore')
conversions etc.OSError
instead ofEnvironmentError
,IOError
,WindowsError
,select.error
,socket.error
EEXIST
,ENOENT
, etc. withFileExistsError
,FileNotFoundError
, etc.