-
Notifications
You must be signed in to change notification settings - Fork 3k
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
Arch with python-pip: TypeError: expected string or bytes-like object #9348
Comments
I attempted to replicate the issue you described with this Dockerfile but was unsuccessful:
The
Note, Can you help produce a Dockerfile that replicates the undesirable behavior? |
Thanks for looking into it! In fact, and I previously did not think this was important, I'm using
Although This brings me to a conclusion that I have
|
Thanks Grzegorz for the repro. With that, I think I've refined the problem a bit further. If you don't install python-pip but instead install pip from source, then also install setuptools using pip (system, then user), the problem doesn't occur:
That leads me to believe that the Arch packaging of pip (or its version) may also be implicated. |
Based on that, I feel like it's more Arch package than setuptools itself. I will consider reporting this issue in Arch bug tracker and I think you can close this issue here at your convenience. Thanks for helping out and mery xmas! |
I'm also on arch linux and have been getting this over the past couple of days. Surely it's no coincidence that mainly arch linux users are having the problem? All that I needed to do was install pip from source rather than from the arch repo: |
To be sure, the issue isn't strictly due to arch's
I looked at the changes for 51.1 and there's nothing there that strikes me as particularly implicated. Here's the diff: https://github.com/pypa/setuptools/compare/v51.0.0..v51.1.0 |
I wonder if maybe the issue is this empty install_requires directive. I've used that same syntax in other projects with no declared dependencies and never had an issue with it, but it seems plausible this declaration has revealed a defect in setuptools or pip. |
I think I've disconfirmed that theory with this Dockerfile, which still fails:
|
I also tried cleaning the indentation on the setup.cfg, but that had no effect on the failure either (6ab9f473c87058ffdc88f357d167d7f7b2750154). |
I tried using pdb to debug pip, but unfortunately, pip is unfriendly to debuggers:
|
I tried installing the exact same versions of pip and setuptools to the system site-packages, and that succeeds without failure:
So that indicates to me there are two factors at play here:
Both are required to trigger the failure. |
I'm able to replicate the issue using a local mounted copy of setuptools for the upgrade install step
I've tried reverting the whole setup.cfg file to the code from v51.0.0 and the problem persists, suggesting that the changes to that file aren't implicated in the issue. |
I will say, what's odd is my system pip location doesn't have setuptools installed (checked via |
Hmm. I tried I'm now beginning to think that Setuptools 51.1 isn't implicated... and the only reason I've previously been unable to replicate the issue with 51.0 was because 51.0 was the version installed by
|
Some (all?) versions of pip will hide certain "special" packages, including setuptools. Run |
You're right, it shows up now. 51.1.0 on both system and user pip locations, with only user pip working. |
I put in some troubleshooting code in req_install.py: diff --git a/src/pip/_internal/req/req_install.py b/src/pip/_internal/req/req_install.py
index f25cec96a..59d479fd6 100644
--- a/src/pip/_internal/req/req_install.py
+++ b/src/pip/_internal/req/req_install.py
@@ -435,6 +435,12 @@ class InstallRequirement(object):
return
existing_version = existing_dist.parsed_version
+
+ try:
+ self.req.specifier.contains(existing_version, prereleases=True)
+ except TypeError:
+ breakpoint()
+
if not self.req.specifier.contains(existing_version, prereleases=True):
self.satisfied_by = None
if use_user_site: And found these are the values present when the issue occurs:
Here's a user reporting a very similar traceback in a very different environment. They never root-caused the issue. |
The same error doesn't occur if I pass the same inputs to the same function:
So there's another factor present that I can't yet see. |
Okay, I'm pretty close to understanding the root cause. Looking at the packaging.specifiers code, I see that the
|
Inspecting the class for that
Here's loosely what's happening:
I'm not sure why this problem doesn't exhibit when using pip and setuptools installed with their vendored dependencies (why do the two versions of packaging not conflict between pkg_resources._vendor and pip._vendor). Regardless, what it boils down to is that you can use one form of package management or another, but mixing arch-managed packages and pip-managed packages may encounter this issue. This issue will likely be addressed when pip moves to relying on importlib_metadata for loading package info (#7413). This issue will also be alleviated if Setuptools could avoid vendoring dependencies, although that effort was tried and failed. There are probably lots of related issues. I found pypa/setuptools#1383. I'm not sure there's a lot Setuptools can do here, and it feels like there are a few options pip could take to address it, so I'm transferring this issue over to pip, although potentially it should be handled more broadly at pypa/packaging-problems. I'll let the pip maintainers decide. |
There are actually multiple places where pip “string-type” the version to prevent this. I’m not very motivated to work on this, however, since this is very difficult to trigger, and arguably a downstream issue that Arch packagers should be responsible for. Things might be different if this happens in other parts of pip, but the two parts that cause this issue—the legacy resolver, and |
Wait, what? This is news to me! |
I suspect the issue is actually PEBCAK. I wanted to use |
No worries @jaraco! I don't know if that workflow works. I have personally used only used GUI debuggers with the debugger() callback. :) This is 100% because Arch is debundling pip, despite our advice to not do so in our vendoring policy. Please take this up with the Arch Linux maintainers. Also, if someone could let them know that I'm requesting them actually vendor stuff in pip, in exchange for not breaking their users in weird ways, that'd be great! :) |
Alternatively, users can avoid using their distro-provided pip, and use pip from get-pip.py, which won't be breakable on this manner. :) |
I used the get-pip via sudo, and it still fails to work via sudo pip, but regular pip now works. |
Please don't sudo install pip. That's a recipe for breaking your Linux distro. :( See https://stackoverflow.com/questions/15028648/is-it-acceptable-and-safe-to-run-pip-install-under-sudo for more details. |
Bumps [pip](https://github.com/pypa/pip) from 21.0.1 to 21.1. <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/pypa/pip/blob/main/NEWS.rst">pip's changelog</a>.</em></p> <blockquote> <h1>21.1 (2021-04-24)</h1> <h2>Process</h2> <ul> <li>Start installation scheme migration from <code>distutils</code> to <code>sysconfig</code>. A warning is implemented to detect differences between the two implementations to encourage user reports, so we can avoid breakages before they happen.</li> </ul> <h2>Features</h2> <ul> <li>Add the ability for the new resolver to process URL constraints. (<code>[#8253](pypa/pip#8253) <https://github.com/pypa/pip/issues/8253></code>_)</li> <li>Add a feature <code>--use-feature=in-tree-build</code> to build local projects in-place when installing. This is expected to become the default behavior in pip 21.3; see <code>Installing from local packages <https://pip.pypa.io/en/stable/user_guide/#installing-from-local-packages></code>_ for more information. (<code>[#9091](pypa/pip#9091) <https://github.com/pypa/pip/issues/9091></code>_)</li> <li>Bring back the "(from versions: ...)" message, that was shown on resolution failures. (<code>[#9139](pypa/pip#9139) <https://github.com/pypa/pip/issues/9139></code>_)</li> <li>Add support for editable installs for project with only setup.cfg files. (<code>[#9547](pypa/pip#9547) <https://github.com/pypa/pip/issues/9547></code>_)</li> <li>Improve performance when picking the best file from indexes during <code>pip install</code>. (<code>[#9748](pypa/pip#9748) <https://github.com/pypa/pip/issues/9748></code>_)</li> <li>Warn instead of erroring out when doing a PEP 517 build in presence of <code>--build-option</code>. Warn when doing a PEP 517 build in presence of <code>--global-option</code>. (<code>[#9774](pypa/pip#9774) <https://github.com/pypa/pip/issues/9774></code>_)</li> </ul> <h2>Bug Fixes</h2> <ul> <li>Fixed <code>--target</code> to work with <code>--editable</code> installs. (<code>[#4390](pypa/pip#4390) <https://github.com/pypa/pip/issues/4390></code>_)</li> <li>Add a warning, discouraging the usage of pip as root, outside a virtual environment. (<code>[#6409](pypa/pip#6409) <https://github.com/pypa/pip/issues/6409></code>_)</li> <li>Ignore <code>.dist-info</code> directories if the stem is not a valid Python distribution name, so they don't show up in e.g. <code>pip freeze</code>. (<code>[#7269](pypa/pip#7269) <https://github.com/pypa/pip/issues/7269></code>_)</li> <li>Only query the keyring for URLs that actually trigger error 401. This prevents an unnecessary keyring unlock prompt on every pip install invocation (even with default index URL which is not password protected). (<code>[#8090](pypa/pip#8090) <https://github.com/pypa/pip/issues/8090></code>_)</li> <li>Prevent packages already-installed alongside with pip to be injected into an isolated build environment during build-time dependency population. (<code>[#8214](pypa/pip#8214) <https://github.com/pypa/pip/issues/8214></code>_)</li> <li>Fix <code>pip freeze</code> permission denied error in order to display an understandable error message and offer solutions. (<code>[#8418](pypa/pip#8418) <https://github.com/pypa/pip/issues/8418></code>_)</li> <li>Correctly uninstall script files (from setuptools' <code>scripts</code> argument), when installed with <code>--user</code>. (<code>[#8733](pypa/pip#8733) <https://github.com/pypa/pip/issues/8733></code>_)</li> <li>New resolver: When a requirement is requested both via a direct URL (<code>req @ URL</code>) and via version specifier with extras (<code>req[extra]</code>), the resolver will now be able to use the URL to correctly resolve the requirement with extras. (<code>[#8785](pypa/pip#8785) <https://github.com/pypa/pip/issues/8785></code>_)</li> <li>New resolver: Show relevant entries from user-supplied constraint files in the error message to improve debuggability. (<code>[#9300](pypa/pip#9300) <https://github.com/pypa/pip/issues/9300></code>_)</li> <li>Avoid parsing version to make the version check more robust against lousily debundled downstream distributions. (<code>[#9348](pypa/pip#9348) <https://github.com/pypa/pip/issues/9348></code>_)</li> <li><code>--user</code> is no longer suggested incorrectly when pip fails with a permission error in a virtual environment. (<code>[#9409](pypa/pip#9409) <https://github.com/pypa/pip/issues/9409></code>_)</li> <li>Fix incorrect reporting on <code>Requires-Python</code> conflicts. (<code>[#9541](pypa/pip#9541) <https://github.com/pypa/pip/issues/9541></code>_)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/pypa/pip/commit/2b2a268d25963727c2a1c805de8f0246b9cd63f6"><code>2b2a268</code></a> Bump for release</li> <li><a href="https://github.com/pypa/pip/commit/ea761a6575f37b90cf89035ee8be3808cf872184"><code>ea761a6</code></a> Update AUTHORS.txt</li> <li><a href="https://github.com/pypa/pip/commit/2edd3fdf2af2f09dce5085ef0eb54684b4f9bc04"><code>2edd3fd</code></a> Postpone a deprecation to 21.2</li> <li><a href="https://github.com/pypa/pip/commit/3cccfbf169bd35133ee25d2543659b9c1e262f8c"><code>3cccfbf</code></a> Rename mislabeled news fragment</li> <li><a href="https://github.com/pypa/pip/commit/21cd124b5d40b510295c201b9152a65ac3337a37"><code>21cd124</code></a> Fix NEWS.rst placeholder position</li> <li><a href="https://github.com/pypa/pip/commit/e46bdda9711392fec0c45c1175bae6db847cb30b"><code>e46bdda</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/pypa/pip/issues/9827">#9827</a> from pradyunsg/fix-git-improper-tag-handling</li> <li><a href="https://github.com/pypa/pip/commit/0e4938d269815a5bf1dd8c16e851cb1199fc5317"><code>0e4938d</code></a> 📰</li> <li><a href="https://github.com/pypa/pip/commit/ca832b2836e0bffa7cf95589acdcd71230f5834e"><code>ca832b2</code></a> Don't split git references on unicode separators</li> <li><a href="https://github.com/pypa/pip/commit/1320bac4ff80d76b8fba2c8b4b4614a40fb9c6c3"><code>1320bac</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/pypa/pip/issues/9814">#9814</a> from pradyunsg/revamp-ci-apr-2021-v2</li> <li><a href="https://github.com/pypa/pip/commit/e9cc23ffd97cb6d66d32dc3ec27cf832524bb33d"><code>e9cc23f</code></a> Skip checks on PRs only</li> <li>Additional commits viewable in <a href="https://github.com/pypa/pip/compare/21.0.1...21.1">compare view</a></li> </ul> </details> <br /> [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=pip&package-manager=pip&previous-version=21.0.1&new-version=21.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually </details>
Solution for Arch users The way I solved this was to uninstall the offending package (
|
As soon as I've upgraded Python from 3.8 to 3.9 on Arch Linux I noticed a strange behaviour with all packages that depend on
setuptools
. What I'll decribe below does NOT happen with Python 3.8 and these packages nor with Python 3.9 and packages that do not depend onsetuptools
. This is shy I'm reporting this issue here.--user
packages, meaning~/.local/bin
,~/.local/lib
and~/.local/include
are all emptysetuptools
, for examplepip install --user vim-vint
- installs OKsetuptools
- installs OKpip install --user locust
- installs OKAt this point you are unable to use
pip install
because it will always give the above error.Observation: even though
setuptools
was originally installed in/usr/lib/python3.9/site-packages/
, after we've installed a package that depends onsetuptools
it was also put in~/.local/lib/python3.9/site-packages/
.The text was updated successfully, but these errors were encountered: