On Tue, Dec 3, 2024 at 7:02 PM Miro Hrončok via python-devel < python-devel@lists.fedoraproject.org> wrote:
> Hello Pythonistas. > > > tl;dr I wonder if we should get rid of the last downstream-only patch in > Fedora's Python, > the one responsible for /usr/local/lib(64)/python... installation location. > The removal would bring us closer to upstream, but perhaps cause a > regression > for our users. > I propose to adapt PEP 668 (Marking Python base environments as > “externally > managed”) instead. > > > Details: > > On Python 3.13+ we only ship one downstream-only patch in Python. > That is a patch that is not yet upstreamable, isn't a backport etc. > > The patch is this: > > > https://src.fedoraproject.org/rpms/python3.13/blob/f39/f/00251-change-user-install-location.patch > (Deliberately linking f39 to make the link stable. Rawhide is currently > the same.) > > Or as a commit: > https://github.com/fedora-python/cpython/commit/ac3a9df5f8 > > We carry this patch in various forms for 7+ years. > It originated with > https://fedoraproject.org/wiki/Changes/Making_sudo_pip_safe > > The idea is this: > > - sudo pip install etc. installs to > /usr/local/lib(64)/python3.X/site-packages > - RPM packages are installed in /usr/lib(64)/python3.X/site-packages > - RPM installed software ignores the packages in /usr/local (unless they > opt > in not to) > - other software uses packages from both, giving preference to /usr/local > > There are several challenges to this approach: > > One of them is upgrading. Ideally if pyfoo 1 is installed via RPM, > sudo pip install --upgrade 'pyfoo>=2' should install pyfoo to /usr/local > while > leaving > the RPM-installed pyfoo 1 be. > In reality, pip is not ready for this and needs a patch as well: > > https://src.fedoraproject.org/rpms/python-pip/blob/f39/f/remove-existing-dist-only-if-path-conflicts.patch > This means that users who do sudo pip install --upgrade pip lose this > patch. > This also means that the fact that this appears to work in other Python > package > managers (such as uv) is probably purely accidental. > This behavior also tends to differ for RPM-packaged Python packages with > .dist-info and .egg-info metadata. > > Another challenge is the mechanism we decided to use for RPM packages to > ignore > /usr/local. > We use the -s flag in shebangs for this. That leads to problems like this: > "global pip installed modules not visible if user site dir is disabled" > https://bugzilla.redhat.com/2256190 > > We could probably solve this by introducing a custom flag instead of -s, > but that would make the patch even worse -- our RPM-packaged software > would not > even execute > without our Python with our patch. I don't want to do that. > > A result of this problem (which is shared with Debian-based distros) was > PEP 668 – Marking Python base environments as “externally managed” > https://peps.python.org/pep-0668/ > Except we cannot use it as is, because our install locations share a > common > stdlib location. > I described this at > > https://discuss.python.org/t/pep-668-marking-python-base-environments-as-externally-managed/10302/46 > and further. > > At this point, after 2 years of failure, I really don't know how to get > something from this that's upstreamable. > > I spoke about this at PyCon PL '22 as well: > https://www.youtube.com/watch?v=7SBH4PkbMhw > > --- > > Recently it occurred to me that perhaps we could: > > 1. drop the patches from Python and pip > 2. mark /usr/lib(64)/python3.X as externally managed (PEP 668) > > So the implication here is that pip will not be allowed to install a package in the system directories that RPMs are installed in? And declare sudo-pip-installing unsupported. (That means, it only works > with a > custom pip flag and if users nuke their systems by using that flag, they > shot > themelves and we cannot help them.) > Honestly I don't see this working and I believe that ship sailed a long time ago unfortunately. Way too many tutorials, books and even workshops recommend "sudo pip install" and before our patch we always had a constant stream of bugs filled about users nuking their systems that way. Personally, I think this would be the best solution: > sudo-pip-installing is bad and should never be done (no, not even in > containers). > > However, I realize that others might disagree. For them, I can offer pip > --break-system-packages. > > > If we want to do this, I think we need to do this on Python upgrade > boundary. > We don't want users sudo pip-installing packages with Python 3.13 on > Fedora 41 > only to find them > ignored on Fedora 42. > However, when we upgrade Python to 3.14 in Fedora 43, their packages would > still be broken anyway. > > -- > Miro Hrončok > -- > Phone: +420777974800 > Fedora Matrix: mhroncok > > -- > _______________________________________________ > python-devel mailing list -- python-devel@lists.fedoraproject.org > To unsubscribe send an email to python-devel-le...@lists.fedoraproject.org > Fedora Code of Conduct: > https://docs.fedoraproject.org/en-US/project/code-of-conduct/ > List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines > List Archives: > https://lists.fedoraproject.org/archives/list/python-devel@lists.fedoraproject.org > Do not reply to spam, report it: > https://pagure.io/fedora-infrastructure/new_issue > -- Regards, Charalampos Stratakis Senior Software Engineer Python Maintenance Team, Red Hat
-- _______________________________________________ python-devel mailing list -- python-devel@lists.fedoraproject.org To unsubscribe send an email to python-devel-le...@lists.fedoraproject.org Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/ List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines List Archives: https://lists.fedoraproject.org/archives/list/python-devel@lists.fedoraproject.org Do not reply to spam, report it: https://pagure.io/fedora-infrastructure/new_issue