pypa / pipenv

Python Development Workflow for Humans.
https://pipenv.pypa.io
MIT License
24.84k stars 1.87k forks source link

Using 2023.9.7 editable package installation fails with build isolation disabled when depending upon setuptools #5925

Open stewartmiles opened 1 year ago

stewartmiles commented 1 year ago

Issue description

When performing an editable install of a package that depends upon setuptools with build isolation disabled (see https://pip.pypa.io/en/stable/cli/pip_install/#cmdoption-no-build-isolation) pipenv clobbers setuptools while it's being used to install an editable package. I assume this is because installs happen in parallel and setuptools gets swapped out from under the editable package while it's being installed.

Expected result

I'm not sure when this last worked, we hadn't upgraded pipenv for quite a while. But at some point this seemed to work, i.e we could install an editable package with pipenv that depends upon setuptools.

Actual result

Removing .venv/
Removing Pipfile
Removing Pipfile.lock
Creating a virtualenv for this project...
Pipfile: /home/stewart/src/pipenv_editable_install_repro/Pipfile
Using /usr/bin/python (3.8.10) to create virtualenv...
created virtual environment CPython3.8.10.final.0-64 in 49ms
  creator CPython3Posix(dest=/home/stewart/src/pipenv_editable_install_repro/.venv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/stewart/.local/share/virtualenv)
    added seed packages: pip==23.2.1, setuptools==68.1.2, wheel==0.41.2
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator

✔ Successfully created virtual environment!
Virtualenv location: /home/stewart/src/pipenv_editable_install_repro/.venv
Creating a Pipfile for this project...
The flag --skip-lock has been reintroduced (but is not recommended).  Without the lock resolver it is difficult to manage multiple package 
indexes, and hash checking is not provided.  However it can help manage installs with current deficiencies in locking across platforms.
Installing -e ./requires-setuptools...
Resolving -e ./requires-setuptools...
Added requires-setuptools to Pipfile's [packages] ...
✔ Installation Succeeded
Installing dependencies from Pipfile...
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
Locking [packages] dependencies...
Building requirements...
Resolving dependencies...
✔ Success!
Locking [dev-packages] dependencies...
Updated Pipfile.lock (c2fec5ff1a495cbfa1fcbdd572d8f990a3559d4d8b69565aa35d34409ad990a3)!
Installing dependencies from Pipfile.lock (d990a3)...
[pipenv.exceptions.InstallError]: Obtaining file:///home/stewart/src/pipenv_editable_install_repro/requires-setuptools (from -r /tmp/pipenv-mql58ofv-requirements/pipenv-anmjg6eu-reqs.txt (line 1))
[pipenv.exceptions.InstallError]:   Checking if build backend supports build_editable: started
[pipenv.exceptions.InstallError]:   Checking if build backend supports build_editable: finished with status 'done'
[pipenv.exceptions.InstallError]:   Preparing editable metadata (pyproject.toml): started
[pipenv.exceptions.InstallError]:   Preparing editable metadata (pyproject.toml): finished with status 'done'
[pipenv.exceptions.InstallError]: ERROR: Exception:
[pipenv.exceptions.InstallError]: Traceback (most recent call last):
[pipenv.exceptions.InstallError]:   File "/home/stewart/.local/pipx/venvs/pipenv/lib/python3.8/site-packages/pipenv/patched/pip/_internal/cli/base_command.py", line 180, in exc_logging_wrapper
[pipenv.exceptions.InstallError]:     status = run_func(*args)
[pipenv.exceptions.InstallError]:   File "/home/stewart/.local/pipx/venvs/pipenv/lib/python3.8/site-packages/pipenv/patched/pip/_internal/cli/req_command.py", line 248, in wrapper
[pipenv.exceptions.InstallError]:     return func(self, options, args)
[pipenv.exceptions.InstallError]:   File "/home/stewart/.local/pipx/venvs/pipenv/lib/python3.8/site-packages/pipenv/patched/pip/_internal/commands/install.py", line 377, in run
[pipenv.exceptions.InstallError]:     requirement_set = resolver.resolve(
[pipenv.exceptions.InstallError]:   File "/home/stewart/.local/pipx/venvs/pipenv/lib/python3.8/site-packages/pipenv/patched/pip/_internal/resolution/resolvelib/resolver.py", line 73, in resolve
[pipenv.exceptions.InstallError]:     collected = self.factory.collect_root_requirements(root_reqs)
[pipenv.exceptions.InstallError]:   File "/home/stewart/.local/pipx/venvs/pipenv/lib/python3.8/site-packages/pipenv/patched/pip/_internal/resolution/resolvelib/factory.py", line 491, in collect_root_requirements
[pipenv.exceptions.InstallError]:     req = self._make_requirement_from_install_req(
[pipenv.exceptions.InstallError]:   File "/home/stewart/.local/pipx/venvs/pipenv/lib/python3.8/site-packages/pipenv/patched/pip/_internal/resolution/resolvelib/factory.py", line 453, in _make_requirement_from_install_req
[pipenv.exceptions.InstallError]:     cand = self._make_candidate_from_link(
[pipenv.exceptions.InstallError]:   File "/home/stewart/.local/pipx/venvs/pipenv/lib/python3.8/site-packages/pipenv/patched/pip/_internal/resolution/resolvelib/factory.py", line 185, in _make_candidate_from_link
[pipenv.exceptions.InstallError]:     self._editable_candidate_cache[link] = EditableCandidate(
[pipenv.exceptions.InstallError]:   File "/home/stewart/.local/pipx/venvs/pipenv/lib/python3.8/site-packages/pipenv/patched/pip/_internal/resolution/resolvelib/candidates.py", line 322, in __init__
[pipenv.exceptions.InstallError]:     super().__init__(
[pipenv.exceptions.InstallError]:   File "/home/stewart/.local/pipx/venvs/pipenv/lib/python3.8/site-packages/pipenv/patched/pip/_internal/resolution/resolvelib/candidates.py", line 157, in __init__
[pipenv.exceptions.InstallError]:     self.dist = self._prepare()
[pipenv.exceptions.InstallError]:   File "/home/stewart/.local/pipx/venvs/pipenv/lib/python3.8/site-packages/pipenv/patched/pip/_internal/resolution/resolvelib/candidates.py", line 226, in _prepare
[pipenv.exceptions.InstallError]:     dist = self._prepare_distribution()
[pipenv.exceptions.InstallError]:   File "/home/stewart/.local/pipx/venvs/pipenv/lib/python3.8/site-packages/pipenv/patched/pip/_internal/resolution/resolvelib/candidates.py", line 332, in _prepare_distribution
[pipenv.exceptions.InstallError]:     return self._factory.preparer.prepare_editable_requirement(self._ireq)
[pipenv.exceptions.InstallError]:   File "/home/stewart/.local/pipx/venvs/pipenv/lib/python3.8/site-packages/pipenv/patched/pip/_internal/operations/prepare.py", line 709, in prepare_editable_requirement
[pipenv.exceptions.InstallError]:     dist = _get_prepared_distribution(
[pipenv.exceptions.InstallError]:   File "/home/stewart/.local/pipx/venvs/pipenv/lib/python3.8/site-packages/pipenv/patched/pip/_internal/operations/prepare.py", line 69, in _get_prepared_distribution
[pipenv.exceptions.InstallError]:     abstract_dist.prepare_distribution_metadata(
[pipenv.exceptions.InstallError]:   File "/home/stewart/.local/pipx/venvs/pipenv/lib/python3.8/site-packages/pipenv/patched/pip/_internal/distributions/sdist.py", line 61, in prepare_distribution_metadata
[pipenv.exceptions.InstallError]:     self.req.prepare_metadata()
[pipenv.exceptions.InstallError]:   File "/home/stewart/.local/pipx/venvs/pipenv/lib/python3.8/site-packages/pipenv/patched/pip/_internal/req/req_install.py", line 557, in prepare_metadata
[pipenv.exceptions.InstallError]:     self.metadata_directory = generate_editable_metadata(
[pipenv.exceptions.InstallError]:   File "/home/stewart/.local/pipx/venvs/pipenv/lib/python3.8/site-packages/pipenv/patched/pip/_internal/operations/build/metadata_editable.py", line 37, in generate_editable_metadata
[pipenv.exceptions.InstallError]:     distinfo_dir = backend.prepare_metadata_for_build_editable(metadata_dir)
[pipenv.exceptions.InstallError]:   File "/home/stewart/.local/pipx/venvs/pipenv/lib/python3.8/site-packages/pipenv/patched/pip/_internal/utils/misc.py", line 731, in prepare_metadata_for_build_editable
[pipenv.exceptions.InstallError]:     return super().prepare_metadata_for_build_editable(
[pipenv.exceptions.InstallError]:   File "/home/stewart/.local/pipx/venvs/pipenv/lib/python3.8/site-packages/pipenv/patched/pip/_vendor/pyproject_hooks/_impl.py", line 246, in prepare_metadata_for_build_editable
[pipenv.exceptions.InstallError]:     return self._call_hook('prepare_metadata_for_build_editable', {
[pipenv.exceptions.InstallError]:   File "/home/stewart/.local/pipx/venvs/pipenv/lib/python3.8/site-packages/pipenv/patched/pip/_vendor/pyproject_hooks/_impl.py", line 321, in _call_hook
[pipenv.exceptions.InstallError]:     raise BackendUnavailable(data.get('traceback', ''))
[pipenv.exceptions.InstallError]: pipenv.patched.pip._vendor.pyproject_hooks._impl.BackendUnavailable: Traceback (most recent call last):
[pipenv.exceptions.InstallError]:   File "/home/stewart/.local/pipx/venvs/pipenv/lib/python3.8/site-packages/pipenv/patched/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 77, in _build_backend
[pipenv.exceptions.InstallError]:     obj = import_module(mod_path)
[pipenv.exceptions.InstallError]:   File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
[pipenv.exceptions.InstallError]:     return _bootstrap._gcd_import(name[level:], package, level)
[pipenv.exceptions.InstallError]:   File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
[pipenv.exceptions.InstallError]:   File "<frozen importlib._bootstrap>", line 991, in _find_and_load
[pipenv.exceptions.InstallError]:   File "<frozen importlib._bootstrap>", line 961, in _find_and_load_unlocked
[pipenv.exceptions.InstallError]:   File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
[pipenv.exceptions.InstallError]:   File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
[pipenv.exceptions.InstallError]:   File "<frozen importlib._bootstrap>", line 991, in _find_and_load
[pipenv.exceptions.InstallError]:   File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
[pipenv.exceptions.InstallError]:   File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
[pipenv.exceptions.InstallError]:   File "<frozen importlib._bootstrap_external>", line 848, in exec_module
[pipenv.exceptions.InstallError]:   File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
[pipenv.exceptions.InstallError]:   File "/home/stewart/src/pipenv_editable_install_repro/.venv/lib/python3.8/site-packages/setuptools/__init__.py", line 15, in <module>
[pipenv.exceptions.InstallError]:   File "/home/stewart/src/pipenv_editable_install_repro/.venv/lib/python3.8/site-packages/setuptools/version.py", line 1, in <module>
[pipenv.exceptions.InstallError]:   File "/home/stewart/src/pipenv_editable_install_repro/.venv/lib/python3.8/site-packages/setuptools/_importlib.py", line 41, in <module>
[pipenv.exceptions.InstallError]:   File "/home/stewart/src/pipenv_editable_install_repro/.venv/lib/python3.8/site-packages/setuptools/extern/__init__.py", line 52, in create_module
[pipenv.exceptions.InstallError]:   File "/home/stewart/src/pipenv_editable_install_repro/.venv/lib/python3.8/site-packages/setuptools/extern/__init__.py", line 44, in load_module
[pipenv.exceptions.InstallError]: ImportError: The 'importlib_metadata' package is required; normally this is bundled with this package so if you get this warning, consult the packager of your distribution.
ERROR: Couldn't install package: {}
 Package installation failed...

Steps to replicate


$ pipenv --support Pipenv version: `'2023.9.7'` Pipenv location: `'/home/stewart/.local/pipx/venvs/pipenv/lib/python3.8/site-packages/pipenv'` Python location: `'/home/stewart/.local/pipx/venvs/pipenv/bin/python'` OS Name: `'posix'` User pip version: `'23.2.1'` user Python installations found: PEP 508 Information: ``` {'implementation_name': 'cpython', 'implementation_version': '3.8.10', 'os_name': 'posix', 'platform_machine': 'x86_64', 'platform_python_implementation': 'CPython', 'platform_release': '5.15.0-69-generic', 'platform_system': 'Linux', 'platform_version': '#76~20.04.1-Ubuntu SMP Mon Mar 20 15:54:19 UTC 2023', 'python_full_version': '3.8.10', 'python_version': '3.8', 'sys_platform': 'linux'} ``` System environment variables: - `SHELL` - `PIPENV_VENV_IN_PROJECT` - `TERMCAP` - `SSH_AUTH_SOCK` - `WINDOW` - `SSH_AGENT_PID` - `PWD` - `LOGNAME` - `XDG_SESSION_TYPE` - `MOTD_SHOWN` - `HOME` - `LANG` - `LS_COLORS` - `SSH_CONNECTION` - `LESSCLOSE` - `XDG_SESSION_CLASS` - `TERM` - `LESSOPEN` - `USER` - `XLA_FLAGS` - `SHLVL` - `XDG_SESSION_ID` - `KUBECONFIG` - `LD_LIBRARY_PATH` - `XDG_RUNTIME_DIR` - `SSH_CLIENT` - `XDG_DATA_DIRS` - `PATH` - `STY` - `DBUS_SESSION_BUS_ADDRESS` - `SSH_TTY` - `USE_GKE_GCLOUD_AUTH_PLUGIN` - `OLDPWD` - `_` - `PIP_DISABLE_PIP_VERSION_CHECK` - `PYTHONDONTWRITEBYTECODE` - `PYTHONFINDER_IGNORE_UNSUPPORTED` Pipenv–specific environment variables: - `PIPENV_VENV_IN_PROJECT`: `true` Debug–specific environment variables: - `PATH`: `/usr/local/cuda/bin:/usr/local/nvidia/bin:/home/stewart/bin/gradle/bin:/home/stewart/bin/cmake/bin:/usr/local/cuda/bin:~/.local/bin:/home/stewart/.local/bin:/home/stewart/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/stewart/bin/node/bin` - `SHELL`: `/bin/bash` - `LANG`: `en_US.UTF-8` - `PWD`: `/home/stewart/src/pipenv_editable_install_repro` --------------------------- Contents of `Pipfile` ('/home/stewart/src/pipenv_editable_install_repro/Pipfile'): ```toml [[source]] url = "https://pypi.org/simple" verify_ssl = true name = "pypi" [packages] requires-setuptools = {file = "requires-setuptools", editable = true} [dev-packages] [requires] python_version = "3.8" python_full_version = "3.8.10" ``` Contents of `Pipfile.lock` ('/home/stewart/src/pipenv_editable_install_repro/Pipfile.lock'): ```json { "_meta": { "hash": { "sha256": "c2fec5ff1a495cbfa1fcbdd572d8f990a3559d4d8b69565aa35d34409ad990a3" }, "pipfile-spec": 6, "requires": { "python_full_version": "3.8.10", "python_version": "3.8" }, "sources": [ { "name": "pypi", "url": "https://pypi.org/simple", "verify_ssl": true } ] }, "default": { "requires-setuptools": { "editable": true, "file": "requires-setuptools" }, "setuptools": { "hashes": [ "sha256:00478ca80aeebeecb2f288d3206b0de568df5cd2b8fada1209843cc9a8d88a48", "sha256:af3d5949030c3f493f550876b2fd1dd5ec66689c4ee5d5344f009746f71fd5a8" ], "markers": "python_version >= '3.8'", "version": "==68.2.0" } }, "develop": {} } ```
stewartmiles commented 1 year ago

Oh I should mention the reason why we use build isolation is that we have a load of editable packages in our development venv, if we had each one installed in an isolated environment it quickly results in O(N-1^2) package installs.

stewartmiles commented 1 year ago

A workaround is to pin setuptools to a specific version in Pipfile, then it's never upgraded but that isn't ideal as you have to remember to unpin and upgrade it periodically.

matteius commented 1 year ago

@stewartmiles Hmmm, this is a case where I would recommend created a prereq category for things like setuptools: pipenv install setuptools --categories=prereq and then install that category first so that its available for the subsequent build step, like pipenv sync --categories="prereq packages" (i forget actually if its packages or default and I see our documentation around this could be improved).

It also reminds me for any folks thinking of participating in Hacktoberfest, it would be cool to be able to specify default catetgories in the pipenv directive so pipenv ran through the categories in that order when no flags were supplied (for convenience)

stewartmiles commented 1 year ago

@matteius I'll have to give that a try. However, if categories work the same way as dev packages (i.e dev category?) then this isn't going to generally work AFAIK since historically pipenv would lock each category independently which can result in each category requiring different or, worse, incompatible versions of packages. To minimize the hacky would it make sense to parse the build requirements (i.e in pyproject.toml) of editable packages and ensure those are installed before installing the editable packages? I think that would work in the general case without pushing knowledge of the dependency graph onto the user.

matteius commented 1 year ago

default packages constraints do constrain all other categories, but that is about it, yeah they are otherwise locked independently.

would it make sense to parse the build requirements (i.e in pyproject.toml) of editable packages and ensure those are installed before installing the editable packages

Actually though requirementslib used to try and do such things, but I was happy to purge that code because in theory if the build environment is setup properly with the right install_requires and not importing things it doesn't have installed yet, then it should be handled fine by pip.

I am actually surprised that you find needing to use no build isolation, because when pipenv install phase happens it uses --no-deps which doesn't install any of the dependencies, and it installs everything in parallel. Are you sure that the no build isolation flag you are passing is actually performing better on the the newer pipenv versions?

matteius commented 1 year ago

Another thing to factor into it is the install phases, each phase technically you would think of as 1 pip install phase, but its actually up to 2 because hash checking I believe and certain features are for the whole install phase, so your editable installs are technically happening after the named installs in the same category. That is probably why adding setuptools actually doesn't need to be done in a prereq category can can be done in the same category as you mentioned.

stewartmiles commented 1 year ago

Actually though requirementslib used to try and do such things, but I was happy to purge that code because in theory if the build environment is setup properly with the right install_requires and not importing things it doesn't have installed yet, then it should be handled fine by pip.

The bummer with this is that it makes things harder when developing with multiple packages in a single repository / venv. If one editable install has a build time dependency upon another, pip install --no-deps fails. The workaround pipenv used to do or perhaps still does, is to run the sync process multiple times before failing out, each pass would install a separate layer of the build dependency tree. Unfortunately, if I remember correctly it only retried 3 times rather than continuing to retry if new packages are installed which means you can only have 3 levels of build time dependencies.

I am actually surprised that you find needing to use no build isolation, because when pipenv install phase happens it uses --no-deps which doesn't install any of the dependencies, and it installs everything in parallel. Are you sure that the no build isolation flag you are passing is actually performing better on the the newer pipenv versions?

Yeah as we have pretty sizeable build time dependencies in pyproject.toml which end being installed over and again for each isolated build.

matteius commented 1 year ago

If one editable install has a build time dependency upon another, pip install --no-deps fails.

That is where named package categories can be useful, because you can stage your build dependencies which it feels like could be worth investing in defining that in the Pipfile via categories for complicated setups where the isolation causes a big increase in install time and cycles.

The workaround pipenv used to do or perhaps still does, is to run the sync process multiple times before failing out, each pass would install a separate layer of the build dependency tree. Unfortunately, if I remember correctly it only retried 3 times rather than continuing to retry if new packages are installed which means you can only have 3 levels of build time dependencies.

Actually I think it only retired once, so the initial plus one retry, but that has since been removed -- I didn't realize anyone was relying on it as a side effect of this type of issue, but the reason it got removed is it was altering between a pep517 (??) flag or not, but as I recall in almost all cases a package that failed in the first iteration would fail again in the second. As you mention the number of iterations could have to be n where n is the number of packages that have build time dependencies.

Sorry that I don't have a magi bullet suggestion on it other than named categories and having a preferred ordering. My preference is to not go back to days of trying to maintain parse setup.py/pyproject.toml/setup.cfg ahead of the pip install, because pip is designed to handle these cases as well. It just felt like a lot of things in requirementslib were stale and broken and duplicating things pip does.

Another thing to note is the old pipenv (the ones with the progress bar) they basically did a sequential install where each dependency was installed not in parallel, in order to track progress, and some sometimes people would get lucky because the ordering the install happened in happened to include build dependencies before other ones, but it wasn't bullet proof.

matteius commented 1 year ago

Last comment for now though would be around setuptools -- you mentioned pinning the version and having to periodically update it -- why not just pin to star unless you know of a restriction keeping you on an old version? This way it gets updated automatically during lock cycles?

matteius commented 1 year ago

Ok most recent thing I discovered that is an issue with todays release is: https://github.com/pypa/pipenv/pull/5926

Not sure if it impacts what you were seeing at all, but I bring it up because you mentioned clobbering setuptools.

matteius commented 1 year ago

Worth checking with https://pypi.org/project/pipenv/2023.9.8/

stewartmiles commented 1 year ago

Sorry that I don't have a magi bullet suggestion on it other than named categories and having a preferred ordering. My preference is to not go back to days of trying to maintain parse setup.py/pyproject.toml/setup.cfg ahead of the pip install, because pip is designed to handle these cases as well. It just felt like a lot of things in requirementslib were stale and broken and duplicating things pip does.

Yeah I feel that. I've dug around in that code a bit and it's great to stop depending upon it. It sounds like supporting build time dependencies of editable wheels isn't a thing pipenv would like to do then? Right now we have a load of code that uses pipenv --graph (i.e deptree) to generate a graph of dependencies after everything is installed and it parses pyproject.toml for build-time dependencies so that we have an install requirements graph and build requirements graph, everything gets installed via the build requirements graph in parallel as much as possible. Everything is checked against the install requirements graph to ensure everything has install time requirements at the end of the sync. I would love to ditch all this crazyiness in favor of just pipenv sync but it sounds like that isn't on the agenda, I'm sure you all have plenty of other fish to fry to get things stable and reduce the vendored forks etc.

Another thing to note is the old pipenv (the ones with the progress bar) they basically did a sequential install where each dependency was installed not in parallel, in order to track progress, and some sometimes people would get lucky because the ordering the install happened in happened to include build dependencies before other ones, but it wasn't bullet proof.

Yeah that was likely helping as the sequential install would avoid the issue in this bug as setuptools would be installed / upgraded then packages that depend upon it at build time could use without the rug being pulled out from under them.

Last comment for now though would be around setuptools -- you mentioned pinning the version and having to periodically update it -- why not just pin to star unless you know of a restriction keeping you on an old version? This way it gets updated automatically during lock cycles?

With a fresh mind (it's the start of my day), I think that would end up with the same issue when initially syncing it. i.e:

pipenv --python $(which python)  # creates venv with older setuptools bundled with pipenv
pipenv sync  # updates setuptools and packages that depend upon it in parallel which causes
             # things to blow up.

I think the only way to get pipenv sync to work in this case is to do one of the following:

Ok most recent thing I discovered that is an issue with todays release is: https://github.com/pypa/pipenv/pull/5926

I had a read through it but I don't think that helps for this issue.

matteius commented 1 year ago

@stewartmiles might be worth trying todays release just in case there was an issue resolving the specific build requirement/dependency, since ignore_compatibility was defaulted to True in yesterdays release. That being said ...

It sounds like supporting build time dependencies of editable wheels isn't a thing pipenv would like to do then?

I guess I don't have a solid answer on this, my initial take was we are supporting it via pip's level of support. The requirementslib code that maybe did that was also maybe not being invoked, because there was a lot of cruft code from the time that pipenv's resolver lived in requirementslib. Maybe one day I can pick apart more if it was truly doing something helpful with regards to build time dependencies, but ideally I would need to know what the last version of pipenv it did work properly on -- its possible we could be looking up the wrong tree.

  • As you describe, use categories and basically install setuptools and build dependencies manually first followed by packages that require setuptools at build time.
  • Pin setuptools to the version bundled with pipenv and manually update this on each pipenv upgrade.

If point two solves it, then are there really other build dependencies to put in a separate package group besides setuptools (pt 1). I think the advantage of having a separate group, is that while named requirements get installed before editable, you would guarantee setuptools is the same for even named requirements ahead of invoking the default group install.

Ditch using packages that need to be built (e.g editable packages) and instead build them using pip wheel and maintain a private repository. This is seriously sucky from a developer workflow point of view IMHO.

Understood.

Bring back pipenv sync --sequential, it would be slow but it would avoid this issue, what do you think?

I am not convinced on this simply because there was never a way to specify the ordering of the sequential install, so I feel its a can of worms to try and support it.

I'll look more at your reproduction example when I have more time and see if there is another angle to consider.

stewartmiles commented 1 year ago

Oh FYI I tried disabling build isolation this morning and wow it's slow with a lot of packages so it's definitely still no good for us.

Again in my hacky repo https://github.com/stewartmiles/pipenv_editable_install_repro , I've added requires-setuptools/install_multiple.sh. It's possible to configure the number of packages using the INSTALL_PACKAGES variable which defaults to 50.

e.g:

INSTALL_PACKAGES=25 time ./requires-setuptools/install_multiple.sh

dumps out a heap of logs with the final time on a hefty 24 core box with fast SSD this takes 1 minute and 24 seconds. All generated packages depend upon the same things so really the resolver shouldn't be doing much work. Out of mild curiosity I fired up top to monitor it and the CPU was doing very little.

matteius commented 1 year ago

@stewartmiles It appears to only be an issue with using --skip-lock

matteius@matteius-VirtualBox:~/pipenv_editable_install_repro$ cat Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
requires-setuptools1 = {file = "requires-setuptools1", editable = true}
requires-setuptools2 = {file = "requires-setuptools2", editable = true}
requires-setuptools3 = {file = "requires-setuptools3", editable = true}
requires-setuptools4 = {file = "requires-setuptools4", editable = true}
requires-setuptools5 = {file = "requires-setuptools5", editable = true}
requires-setuptools6 = {file = "requires-setuptools6", editable = true}
requires-setuptools7 = {file = "requires-setuptools7", editable = true}
requires-setuptools8 = {file = "requires-setuptools8", editable = true}
requires-setuptools9 = {file = "requires-setuptools9", editable = true}
requires-setuptools10 = {file = "requires-setuptools10", editable = true}
requires-setuptools11 = {file = "requires-setuptools11", editable = true}
requires-setuptools12 = {file = "requires-setuptools12", editable = true}
requires-setuptools13 = {file = "requires-setuptools13", editable = true}
requires-setuptools14 = {file = "requires-setuptools14", editable = true}
requires-setuptools15 = {file = "requires-setuptools15", editable = true}
requires-setuptools16 = {file = "requires-setuptools16", editable = true}
requires-setuptools17 = {file = "requires-setuptools17", editable = true}
requires-setuptools18 = {file = "requires-setuptools18", editable = true}
requires-setuptools19 = {file = "requires-setuptools19", editable = true}
requires-setuptools20 = {file = "requires-setuptools20", editable = true}
requires-setuptools21 = {file = "requires-setuptools21", editable = true}
requires-setuptools22 = {file = "requires-setuptools22", editable = true}
requires-setuptools23 = {file = "requires-setuptools23", editable = true}
requires-setuptools24 = {file = "requires-setuptools24", editable = true}
requires-setuptools25 = {file = "requires-setuptools25", editable = true}
requires-setuptools26 = {file = "requires-setuptools26", editable = true}
requires-setuptools27 = {file = "requires-setuptools27", editable = true}
requires-setuptools28 = {file = "requires-setuptools28", editable = true}
requires-setuptools29 = {file = "requires-setuptools29", editable = true}
requires-setuptools30 = {file = "requires-setuptools30", editable = true}
requires-setuptools31 = {file = "requires-setuptools31", editable = true}
requires-setuptools32 = {file = "requires-setuptools32", editable = true}
requires-setuptools33 = {file = "requires-setuptools33", editable = true}
requires-setuptools34 = {file = "requires-setuptools34", editable = true}
requires-setuptools35 = {file = "requires-setuptools35", editable = true}
requires-setuptools36 = {file = "requires-setuptools36", editable = true}
requires-setuptools37 = {file = "requires-setuptools37", editable = true}
requires-setuptools38 = {file = "requires-setuptools38", editable = true}
requires-setuptools39 = {file = "requires-setuptools39", editable = true}
requires-setuptools40 = {file = "requires-setuptools40", editable = true}
requires-setuptools41 = {file = "requires-setuptools41", editable = true}
requires-setuptools42 = {file = "requires-setuptools42", editable = true}
requires-setuptools43 = {file = "requires-setuptools43", editable = true}
requires-setuptools44 = {file = "requires-setuptools44", editable = true}
requires-setuptools45 = {file = "requires-setuptools45", editable = true}
requires-setuptools46 = {file = "requires-setuptools46", editable = true}
requires-setuptools47 = {file = "requires-setuptools47", editable = true}
requires-setuptools48 = {file = "requires-setuptools48", editable = true}
requires-setuptools49 = {file = "requires-setuptools49", editable = true}
requires-setuptools50 = {file = "requires-setuptools50", editable = true}

[dev-packages]

[requires]
python_version = "3.10"
python_full_version = "3.10.12"
matteius@matteius-VirtualBox:~/pipenv_editable_install_repro$ cat Pipfile.lock 
{
    "_meta": {
        "hash": {
            "sha256": "7a3625721f1d53e1cec0190bcf5e0f6e71096be95fe6deddecf8d17bf2edc405"
        },
        "pipfile-spec": 6,
        "requires": {
            "python_full_version": "3.10.12",
            "python_version": "3.10"
        },
        "sources": [
            {
                "name": "pypi",
                "url": "https://pypi.org/simple",
                "verify_ssl": true
            }
        ]
    },
    "default": {
        "requires-setuptools1": {
            "editable": true,
            "file": "requires-setuptools1"
        },
        "requires-setuptools10": {
            "editable": true,
            "file": "requires-setuptools10"
        },
        "requires-setuptools11": {
            "editable": true,
            "file": "requires-setuptools11"
        },
        "requires-setuptools12": {
            "editable": true,
            "file": "requires-setuptools12"
        },
        "requires-setuptools13": {
            "editable": true,
            "file": "requires-setuptools13"
        },
        "requires-setuptools14": {
            "editable": true,
            "file": "requires-setuptools14"
        },
        "requires-setuptools15": {
            "editable": true,
            "file": "requires-setuptools15"
        },
        "requires-setuptools16": {
            "editable": true,
            "file": "requires-setuptools16"
        },
        "requires-setuptools17": {
            "editable": true,
            "file": "requires-setuptools17"
        },
        "requires-setuptools18": {
            "editable": true,
            "file": "requires-setuptools18"
        },
        "requires-setuptools19": {
            "editable": true,
            "file": "requires-setuptools19"
        },
        "requires-setuptools2": {
            "editable": true,
            "file": "requires-setuptools2"
        },
        "requires-setuptools20": {
            "editable": true,
            "file": "requires-setuptools20"
        },
        "requires-setuptools21": {
            "editable": true,
            "file": "requires-setuptools21"
        },
        "requires-setuptools22": {
            "editable": true,
            "file": "requires-setuptools22"
        },
        "requires-setuptools23": {
            "editable": true,
            "file": "requires-setuptools23"
        },
        "requires-setuptools24": {
            "editable": true,
            "file": "requires-setuptools24"
        },
        "requires-setuptools25": {
            "editable": true,
            "file": "requires-setuptools25"
        },
        "requires-setuptools26": {
            "editable": true,
            "file": "requires-setuptools26"
        },
        "requires-setuptools27": {
            "editable": true,
            "file": "requires-setuptools27"
        },
        "requires-setuptools28": {
            "editable": true,
            "file": "requires-setuptools28"
        },
        "requires-setuptools29": {
            "editable": true,
            "file": "requires-setuptools29"
        },
        "requires-setuptools3": {
            "editable": true,
            "file": "requires-setuptools3"
        },
        "requires-setuptools30": {
            "editable": true,
            "file": "requires-setuptools30"
        },
        "requires-setuptools31": {
            "editable": true,
            "file": "requires-setuptools31"
        },
        "requires-setuptools32": {
            "editable": true,
            "file": "requires-setuptools32"
        },
        "requires-setuptools33": {
            "editable": true,
            "file": "requires-setuptools33"
        },
        "requires-setuptools34": {
            "editable": true,
            "file": "requires-setuptools34"
        },
        "requires-setuptools35": {
            "editable": true,
            "file": "requires-setuptools35"
        },
        "requires-setuptools36": {
            "editable": true,
            "file": "requires-setuptools36"
        },
        "requires-setuptools37": {
            "editable": true,
            "file": "requires-setuptools37"
        },
        "requires-setuptools38": {
            "editable": true,
            "file": "requires-setuptools38"
        },
        "requires-setuptools39": {
            "editable": true,
            "file": "requires-setuptools39"
        },
        "requires-setuptools4": {
            "editable": true,
            "file": "requires-setuptools4"
        },
        "requires-setuptools40": {
            "editable": true,
            "file": "requires-setuptools40"
        },
        "requires-setuptools41": {
            "editable": true,
            "file": "requires-setuptools41"
        },
        "requires-setuptools42": {
            "editable": true,
            "file": "requires-setuptools42"
        },
        "requires-setuptools43": {
            "editable": true,
            "file": "requires-setuptools43"
        },
        "requires-setuptools44": {
            "editable": true,
            "file": "requires-setuptools44"
        },
        "requires-setuptools45": {
            "editable": true,
            "file": "requires-setuptools45"
        },
        "requires-setuptools46": {
            "editable": true,
            "file": "requires-setuptools46"
        },
        "requires-setuptools47": {
            "editable": true,
            "file": "requires-setuptools47"
        },
        "requires-setuptools48": {
            "editable": true,
            "file": "requires-setuptools48"
        },
        "requires-setuptools49": {
            "editable": true,
            "file": "requires-setuptools49"
        },
        "requires-setuptools5": {
            "editable": true,
            "file": "requires-setuptools5"
        },
        "requires-setuptools50": {
            "editable": true,
            "file": "requires-setuptools50"
        },
        "requires-setuptools6": {
            "editable": true,
            "file": "requires-setuptools6"
        },
        "requires-setuptools7": {
            "editable": true,
            "file": "requires-setuptools7"
        },
        "requires-setuptools8": {
            "editable": true,
            "file": "requires-setuptools8"
        },
        "requires-setuptools9": {
            "editable": true,
            "file": "requires-setuptools9"
        },
        "setuptools": {
            "hashes": [
                "sha256:00478ca80aeebeecb2f288d3206b0de568df5cd2b8fada1209843cc9a8d88a48",
                "sha256:af3d5949030c3f493f550876b2fd1dd5ec66689c4ee5d5344f009746f71fd5a8"
            ],
            "markers": "python_version >= '3.8'",
            "version": "==68.2.0"
        }
    },
    "develop": {}
}
matteius@matteius-VirtualBox:~/pipenv_editable_install_repro$ pipenv sync
Installing dependencies from Pipfile.lock (edc405)...
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
All dependencies are now up-to-date!
matteius commented 1 year ago

Worth noting too that I had to modify install.sh by moving it up a directory and commenting out the cd line, because it was getting into a circular import otherwise.

matteius commented 1 year ago

I think the difference is --skip-lock without the Pipfile specifier for setuptools, doesn't actually know that setuptools is required yet so it enters the install phase directly into the editable install and without build isolation each project is concurrently installing/removing setuptools as needed which results in the parallel build failures. However in your example, operating off the lock file, the lock file picks up the fact setuptools is required without adding it to the Pipfile, and because its in the lock, that gets installed as a named requirement first and is available to all the editable installs.

In other words, I don't think pipenv is going to support well the use of: skip-lock with no build isolation, and not pre-supplying build dependencies. Can you remind me again why you are using --skip-lock?

matteius commented 1 year ago

I just figured something out -- if you want to use --skip-lock try adding to your script: export PIP_CHECK_BUILD_DEPENDENCIES=1; which "Check the build dependencies when PEP517 is used." and remove the lock/sync steps as the sync doesn't appear to work when skip lock env var is set. Alternatively, without skip-lock also works (important to not set the same env var that works with skip-lock)

Using skip-lock

matteius@matteius-VirtualBox:~/pipenv_editable_install_repro$ cat install.sh 
#!/bin/bash -eu
# Flip PIP_NO_BUILD_ISOLATION to 1 fix the installation with pipenv 2023.9.7
export PIP_NO_BUILD_ISOLATION=0;
export PIP_CHECK_BUILD_DEPENDENCIES=1;
export PIPENV_SKIP_LOCK=true;
export PIPENV_VENV_IN_PROJECT=true;
#cd "$(cd "$(dirname "${0}")"; pwd)/.."
#git clean -dfx
pipenv --python "$(command -v python)"
declare -a pipenv_install_args=()
for i in $(seq 1 50); do
  package_name=requires-setuptools$((i))
  cp -r ./requires-setuptools "./${package_name}"
  sed -i "s/requires-setuptools/${package_name}/g" \
      "./${package_name}/setup.py"
  pipenv_install_args+=('-e' "./${package_name}")
done
set -x
export PIP_LOG_FILE=/dev/stdout
pipenv install "${pipenv_install_args[@]}"
#pipenv lock
#pipenv sync

matteius@matteius-VirtualBox:~/pipenv_editable_install_repro$ pipenv --rm
No virtualenv has been created for this project yet!
Aborted!
matteius@matteius-VirtualBox:~/pipenv_editable_install_repro$ vim install.sh 
matteius@matteius-VirtualBox:~/pipenv_editable_install_repro$ ./install.sh 
Creating a virtualenv for this project...
Pipfile: /home/matteius/pipenv_editable_install_repro/Pipfile
Using /usr/bin/python (3.10.12) to create virtualenv...
⠹ Creating virtual environment...created virtual environment CPython3.10.12.final.0-64 in 188ms
  creator CPython3Posix(dest=/home/matteius/pipenv_editable_install_repro/.venv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/matteius/.local/share/virtualenv)
    added seed packages: pip==23.2.1, setuptools==68.0.0, wheel==0.41.2
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator

✔ Successfully created virtual environment!
Virtualenv location: /home/matteius/pipenv_editable_install_repro/.venv
+ export PIP_LOG_FILE=/dev/stdout
+ PIP_LOG_FILE=/dev/stdout
+ pipenv install -e ./requires-setuptools1 -e ./requires-setuptools2 -e ./requires-setuptools3 -e ./requires-setuptools4 -e ./requires-setuptools5 -e ./requires-setuptools6 -e ./requires-setuptools7 -e ./requires-setuptools8 -e ./requires-setuptools9 -e ./requires-setuptools10 -e ./requires-setuptools11 -e ./requires-setuptools12 -e ./requires-setuptools13 -e ./requires-setuptools14 -e ./requires-setuptools15 -e ./requires-setuptools16 -e ./requires-setuptools17 -e ./requires-setuptools18 -e ./requires-setuptools19 -e ./requires-setuptools20 -e ./requires-setuptools21 -e ./requires-setuptools22 -e ./requires-setuptools23 -e ./requires-setuptools24 -e ./requires-setuptools25 -e ./requires-setuptools26 -e ./requires-setuptools27 -e ./requires-setuptools28 -e ./requires-setuptools29 -e ./requires-setuptools30 -e ./requires-setuptools31 -e ./requires-setuptools32 -e ./requires-setuptools33 -e ./requires-setuptools34 -e ./requires-setuptools35 -e ./requires-setuptools36 -e ./requires-setuptools37 -e ./requires-setuptools38 -e ./requires-setuptools39 -e ./requires-setuptools40 -e ./requires-setuptools41 -e ./requires-setuptools42 -e ./requires-setuptools43 -e ./requires-setuptools44 -e ./requires-setuptools45 -e ./requires-setuptools46 -e ./requires-setuptools47 -e ./requires-setuptools48 -e ./requires-setuptools49 -e ./requires-setuptools50
The flag --skip-lock has been reintroduced (but is not recommended).  Without the lock resolver it is difficult to manage multiple package indexes, and hash checking is not provided.  However it can help
manage installs with current deficiencies in locking across platforms.
Installing -e ./requires-setuptools1...
Resolving -e ./requires-setuptools1...
✔ Installation Succeeded
Installing -e ./requires-setuptools2...
Resolving -e ./requires-setuptools2...
✔ Installation Succeeded
Installing -e ./requires-setuptools3...
Resolving -e ./requires-setuptools3...
✔ Installation Succeeded
Installing -e ./requires-setuptools4...
Resolving -e ./requires-setuptools4...
✔ Installation Succeeded
Installing -e ./requires-setuptools5...
Resolving -e ./requires-setuptools5...
✔ Installation Succeeded
Installing -e ./requires-setuptools6...
Resolving -e ./requires-setuptools6...
✔ Installation Succeeded
Installing -e ./requires-setuptools7...
Resolving -e ./requires-setuptools7...
✔ Installation Succeeded
Installing -e ./requires-setuptools8...
Resolving -e ./requires-setuptools8...
✔ Installation Succeeded
Installing -e ./requires-setuptools9...
Resolving -e ./requires-setuptools9...
✔ Installation Succeeded
Installing -e ./requires-setuptools10...
Resolving -e ./requires-setuptools10...
✔ Installation Succeeded
Installing -e ./requires-setuptools11...
Resolving -e ./requires-setuptools11...
✔ Installation Succeeded
Installing -e ./requires-setuptools12...
Resolving -e ./requires-setuptools12...
✔ Installation Succeeded
Installing -e ./requires-setuptools13...
Resolving -e ./requires-setuptools13...
✔ Installation Succeeded
Installing -e ./requires-setuptools14...
Resolving -e ./requires-setuptools14...
✔ Installation Succeeded
Installing -e ./requires-setuptools15...
Resolving -e ./requires-setuptools15...
✔ Installation Succeeded
Installing -e ./requires-setuptools16...
Resolving -e ./requires-setuptools16...
✔ Installation Succeeded
Installing -e ./requires-setuptools17...
Resolving -e ./requires-setuptools17...
✔ Installation Succeeded
Installing -e ./requires-setuptools18...
Resolving -e ./requires-setuptools18...
✔ Installation Succeeded
Installing -e ./requires-setuptools19...
Resolving -e ./requires-setuptools19...
✔ Installation Succeeded
Installing -e ./requires-setuptools20...
Resolving -e ./requires-setuptools20...
✔ Installation Succeeded
Installing -e ./requires-setuptools21...
Resolving -e ./requires-setuptools21...
✔ Installation Succeeded
Installing -e ./requires-setuptools22...
Resolving -e ./requires-setuptools22...
✔ Installation Succeeded
Installing -e ./requires-setuptools23...
Resolving -e ./requires-setuptools23...
✔ Installation Succeeded
Installing -e ./requires-setuptools24...
Resolving -e ./requires-setuptools24...
✔ Installation Succeeded
Installing -e ./requires-setuptools25...
Resolving -e ./requires-setuptools25...
✔ Installation Succeeded
Installing -e ./requires-setuptools26...
Resolving -e ./requires-setuptools26...
✔ Installation Succeeded
Installing -e ./requires-setuptools27...
Resolving -e ./requires-setuptools27...
✔ Installation Succeeded
Installing -e ./requires-setuptools28...
Resolving -e ./requires-setuptools28...
✔ Installation Succeeded
Installing -e ./requires-setuptools29...
Resolving -e ./requires-setuptools29...
✔ Installation Succeeded
Installing -e ./requires-setuptools30...
Resolving -e ./requires-setuptools30...
✔ Installation Succeeded
Installing -e ./requires-setuptools31...
Resolving -e ./requires-setuptools31...
✔ Installation Succeeded
Installing -e ./requires-setuptools32...
Resolving -e ./requires-setuptools32...
✔ Installation Succeeded
Installing -e ./requires-setuptools33...
Resolving -e ./requires-setuptools33...
✔ Installation Succeeded
Installing -e ./requires-setuptools34...
Resolving -e ./requires-setuptools34...
✔ Installation Succeeded
Installing -e ./requires-setuptools35...
Resolving -e ./requires-setuptools35...
✔ Installation Succeeded
Installing -e ./requires-setuptools36...
Resolving -e ./requires-setuptools36...
✔ Installation Succeeded
Installing -e ./requires-setuptools37...
Resolving -e ./requires-setuptools37...
✔ Installation Succeeded
Installing -e ./requires-setuptools38...
Resolving -e ./requires-setuptools38...
✔ Installation Succeeded
Installing -e ./requires-setuptools39...
Resolving -e ./requires-setuptools39...
✔ Installation Succeeded
Installing -e ./requires-setuptools40...
Resolving -e ./requires-setuptools40...
✔ Installation Succeeded
Installing -e ./requires-setuptools41...
Resolving -e ./requires-setuptools41...
✔ Installation Succeeded
Installing -e ./requires-setuptools42...
Resolving -e ./requires-setuptools42...
✔ Installation Succeeded
Installing -e ./requires-setuptools43...
Resolving -e ./requires-setuptools43...
✔ Installation Succeeded
Installing -e ./requires-setuptools44...
Resolving -e ./requires-setuptools44...
✔ Installation Succeeded
Installing -e ./requires-setuptools45...
Resolving -e ./requires-setuptools45...
✔ Installation Succeeded
Installing -e ./requires-setuptools46...
Resolving -e ./requires-setuptools46...
✔ Installation Succeeded
Installing -e ./requires-setuptools47...
Resolving -e ./requires-setuptools47...
✔ Installation Succeeded
Installing -e ./requires-setuptools48...
Resolving -e ./requires-setuptools48...
✔ Installation Succeeded
Installing -e ./requires-setuptools49...
Resolving -e ./requires-setuptools49...
✔ Installation Succeeded
Installing -e ./requires-setuptools50...
Resolving -e ./requires-setuptools50...
✔ Installation Succeeded
Installing dependencies from Pipfile...
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
matteius@matteius-VirtualBox:~/pipenv_editable_install_repro$ pipenv run pip freeze
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools1&subdirectory=requires-setuptools1
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools10&subdirectory=requires-setuptools10
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools11&subdirectory=requires-setuptools11
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools12&subdirectory=requires-setuptools12
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools13&subdirectory=requires-setuptools13
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools14&subdirectory=requires-setuptools14
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools15&subdirectory=requires-setuptools15
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools16&subdirectory=requires-setuptools16
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools17&subdirectory=requires-setuptools17
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools18&subdirectory=requires-setuptools18
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools19&subdirectory=requires-setuptools19
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools2&subdirectory=requires-setuptools2
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools20&subdirectory=requires-setuptools20
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools21&subdirectory=requires-setuptools21
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools22&subdirectory=requires-setuptools22
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools23&subdirectory=requires-setuptools23
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools24&subdirectory=requires-setuptools24
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools25&subdirectory=requires-setuptools25
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools26&subdirectory=requires-setuptools26
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools27&subdirectory=requires-setuptools27
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools28&subdirectory=requires-setuptools28
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools29&subdirectory=requires-setuptools29
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools3&subdirectory=requires-setuptools3
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools30&subdirectory=requires-setuptools30
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools31&subdirectory=requires-setuptools31
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools32&subdirectory=requires-setuptools32
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools33&subdirectory=requires-setuptools33
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools34&subdirectory=requires-setuptools34
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools35&subdirectory=requires-setuptools35
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools36&subdirectory=requires-setuptools36
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools37&subdirectory=requires-setuptools37
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools38&subdirectory=requires-setuptools38
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools39&subdirectory=requires-setuptools39
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools4&subdirectory=requires-setuptools4
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools40&subdirectory=requires-setuptools40
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools41&subdirectory=requires-setuptools41
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools42&subdirectory=requires-setuptools42
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools43&subdirectory=requires-setuptools43
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools44&subdirectory=requires-setuptools44
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools45&subdirectory=requires-setuptools45
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools46&subdirectory=requires-setuptools46
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools47&subdirectory=requires-setuptools47
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools48&subdirectory=requires-setuptools48
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools49&subdirectory=requires-setuptools49
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools5&subdirectory=requires-setuptools5
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools50&subdirectory=requires-setuptools50
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools6&subdirectory=requires-setuptools6
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools7&subdirectory=requires-setuptools7
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools8&subdirectory=requires-setuptools8
-e git+https://github.com/stewartmiles/pipenv_editable_install_repro@d4c7374b801694eec7b351723732ce996a5d4112#egg=requires_setuptools9&subdirectory=requires-setuptools9

not using skip-lock

matteius@matteius-VirtualBox:~/pipenv_editable_install_repro$ pipenv --rm
Removing virtualenv (/home/matteius/pipenv_editable_install_repro/.venv)...
matteius@matteius-VirtualBox:~/pipenv_editable_install_repro$ vim Pipfile
matteius@matteius-VirtualBox:~/pipenv_editable_install_repro$ rm Pipfile*
matteius@matteius-VirtualBox:~/pipenv_editable_install_repro$ vim install.sh 
matteius@matteius-VirtualBox:~/pipenv_editable_install_repro$ pipenv ^C
matteius@matteius-VirtualBox:~/pipenv_editable_install_repro$ ls
applications           requires-setuptools12  requires-setuptools19  requires-setuptools25  requires-setuptools31  requires-setuptools38  requires-setuptools44  requires-setuptools50
install.sh             requires-setuptools13  requires-setuptools2   requires-setuptools26  requires-setuptools32  requires-setuptools39  requires-setuptools45  requires-setuptools6
LICENSE                requires-setuptools14  requires-setuptools20  requires-setuptools27  requires-setuptools33  requires-setuptools4   requires-setuptools46  requires-setuptools7
requires-setuptools    requires-setuptools15  requires-setuptools21  requires-setuptools28  requires-setuptools34  requires-setuptools40  requires-setuptools47  requires-setuptools8
requires-setuptools1   requires-setuptools16  requires-setuptools22  requires-setuptools29  requires-setuptools35  requires-setuptools41  requires-setuptools48  requires-setuptools9
requires-setuptools10  requires-setuptools17  requires-setuptools23  requires-setuptools3   requires-setuptools36  requires-setuptools42  requires-setuptools49  test-hello
requires-setuptools11  requires-setuptools18  requires-setuptools24  requires-setuptools30  requires-setuptools37  requires-setuptools43  requires-setuptools5   try_pipenv_versions.sh
matteius@matteius-VirtualBox:~/pipenv_editable_install_repro$ cat install.sh 
#!/bin/bash -eu
# Flip PIP_NO_BUILD_ISOLATION to 1 fix the installation with pipenv 2023.9.7
export PIP_NO_BUILD_ISOLATION=0;
#export PIP_CHECK_BUILD_DEPENDENCIES=1;
export PIPENV_VENV_IN_PROJECT=true;
#cd "$(cd "$(dirname "${0}")"; pwd)/.."
#git clean -dfx
pipenv --python "$(command -v python)"
declare -a pipenv_install_args=()
for i in $(seq 1 50); do
  package_name=requires-setuptools$((i))
  cp -r ./requires-setuptools "./${package_name}"
  sed -i "s/requires-setuptools/${package_name}/g" \
      "./${package_name}/setup.py"
  pipenv_install_args+=('-e' "./${package_name}")
done
set -x
export PIP_LOG_FILE=/dev/stdout
pipenv install "${pipenv_install_args[@]}"
pipenv lock
pipenv sync
matteius@matteius-VirtualBox:~/pipenv_editable_install_repro$ ./install.sh 
Creating a virtualenv for this project...
Pipfile: /home/matteius/pipenv_editable_install_repro/Pipfile
Using /usr/bin/python (3.10.12) to create virtualenv...
⠹ Creating virtual environment...created virtual environment CPython3.10.12.final.0-64 in 223ms
  creator CPython3Posix(dest=/home/matteius/pipenv_editable_install_repro/.venv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/matteius/.local/share/virtualenv)
    added seed packages: pip==23.2.1, setuptools==68.0.0, wheel==0.41.2
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator

✔ Successfully created virtual environment!
Virtualenv location: /home/matteius/pipenv_editable_install_repro/.venv
Creating a Pipfile for this project...
+ export PIP_LOG_FILE=/dev/stdout
+ PIP_LOG_FILE=/dev/stdout
+ pipenv install -e ./requires-setuptools1 -e ./requires-setuptools2 -e ./requires-setuptools3 -e ./requires-setuptools4 -e ./requires-setuptools5 -e ./requires-setuptools6 -e ./requires-setuptools7 -e ./requires-setuptools8 -e ./requires-setuptools9 -e ./requires-setuptools10 -e ./requires-setuptools11 -e ./requires-setuptools12 -e ./requires-setuptools13 -e ./requires-setuptools14 -e ./requires-setuptools15 -e ./requires-setuptools16 -e ./requires-setuptools17 -e ./requires-setuptools18 -e ./requires-setuptools19 -e ./requires-setuptools20 -e ./requires-setuptools21 -e ./requires-setuptools22 -e ./requires-setuptools23 -e ./requires-setuptools24 -e ./requires-setuptools25 -e ./requires-setuptools26 -e ./requires-setuptools27 -e ./requires-setuptools28 -e ./requires-setuptools29 -e ./requires-setuptools30 -e ./requires-setuptools31 -e ./requires-setuptools32 -e ./requires-setuptools33 -e ./requires-setuptools34 -e ./requires-setuptools35 -e ./requires-setuptools36 -e ./requires-setuptools37 -e ./requires-setuptools38 -e ./requires-setuptools39 -e ./requires-setuptools40 -e ./requires-setuptools41 -e ./requires-setuptools42 -e ./requires-setuptools43 -e ./requires-setuptools44 -e ./requires-setuptools45 -e ./requires-setuptools46 -e ./requires-setuptools47 -e ./requires-setuptools48 -e ./requires-setuptools49 -e ./requires-setuptools50
Installing -e ./requires-setuptools1...
Resolving -e ./requires-setuptools1...
Added requires-setuptools11 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools2...
Resolving -e ./requires-setuptools2...
Added requires-setuptools22 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools3...
Resolving -e ./requires-setuptools3...
Added requires-setuptools33 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools4...
Resolving -e ./requires-setuptools4...
Added requires-setuptools44 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools5...
Resolving -e ./requires-setuptools5...
Added requires-setuptools55 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools6...
Resolving -e ./requires-setuptools6...
Added requires-setuptools66 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools7...
Resolving -e ./requires-setuptools7...
Added requires-setuptools77 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools8...
Resolving -e ./requires-setuptools8...
Added requires-setuptools88 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools9...
Resolving -e ./requires-setuptools9...
Added requires-setuptools99 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools10...
Resolving -e ./requires-setuptools10...
Added requires-setuptools1010 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools11...
Resolving -e ./requires-setuptools11...
Added requires-setuptools1111 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools12...
Resolving -e ./requires-setuptools12...
Added requires-setuptools1212 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools13...
Resolving -e ./requires-setuptools13...
Added requires-setuptools1313 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools14...
Resolving -e ./requires-setuptools14...
Added requires-setuptools1414 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools15...
Resolving -e ./requires-setuptools15...
Added requires-setuptools1515 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools16...
Resolving -e ./requires-setuptools16...
Added requires-setuptools1616 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools17...
Resolving -e ./requires-setuptools17...
Added requires-setuptools1717 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools18...
Resolving -e ./requires-setuptools18...
Added requires-setuptools1818 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools19...
Resolving -e ./requires-setuptools19...
Added requires-setuptools1919 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools20...
Resolving -e ./requires-setuptools20...
Added requires-setuptools2020 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools21...
Resolving -e ./requires-setuptools21...
Added requires-setuptools2121 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools22...
Resolving -e ./requires-setuptools22...
Added requires-setuptools2222 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools23...
Resolving -e ./requires-setuptools23...
Added requires-setuptools2323 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools24...
Resolving -e ./requires-setuptools24...
Added requires-setuptools2424 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools25...
Resolving -e ./requires-setuptools25...
Added requires-setuptools2525 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools26...
Resolving -e ./requires-setuptools26...
Added requires-setuptools2626 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools27...
Resolving -e ./requires-setuptools27...
Added requires-setuptools2727 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools28...
Resolving -e ./requires-setuptools28...
Added requires-setuptools2828 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools29...
Resolving -e ./requires-setuptools29...
Added requires-setuptools2929 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools30...
Resolving -e ./requires-setuptools30...
Added requires-setuptools3030 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools31...
Resolving -e ./requires-setuptools31...
Added requires-setuptools3131 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools32...
Resolving -e ./requires-setuptools32...
Added requires-setuptools3232 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools33...
Resolving -e ./requires-setuptools33...
Added requires-setuptools3333 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools34...
Resolving -e ./requires-setuptools34...
Added requires-setuptools3434 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools35...
Resolving -e ./requires-setuptools35...
Added requires-setuptools3535 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools36...
Resolving -e ./requires-setuptools36...
Added requires-setuptools3636 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools37...
Resolving -e ./requires-setuptools37...
Added requires-setuptools3737 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools38...
Resolving -e ./requires-setuptools38...
Added requires-setuptools3838 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools39...
Resolving -e ./requires-setuptools39...
Added requires-setuptools3939 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools40...
Resolving -e ./requires-setuptools40...
Added requires-setuptools4040 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools41...
Resolving -e ./requires-setuptools41...
Added requires-setuptools4141 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools42...
Resolving -e ./requires-setuptools42...
Added requires-setuptools4242 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools43...
Resolving -e ./requires-setuptools43...
Added requires-setuptools4343 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools44...
Resolving -e ./requires-setuptools44...
Added requires-setuptools4444 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools45...
Resolving -e ./requires-setuptools45...
Added requires-setuptools4545 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools46...
Resolving -e ./requires-setuptools46...
Added requires-setuptools4646 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools47...
Resolving -e ./requires-setuptools47...
Added requires-setuptools4747 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools48...
Resolving -e ./requires-setuptools48...
Added requires-setuptools4848 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools49...
Resolving -e ./requires-setuptools49...
Added requires-setuptools4949 to Pipfile's [packages] ...
✔ Installation Succeeded
Installing -e ./requires-setuptools50...
Resolving -e ./requires-setuptools50...
Added requires-setuptools5050 to Pipfile's [packages] ...
✔ Installation Succeeded
Pipfile.lock not found, creating...
Locking [packages] dependencies...
Building requirements...
Resolving dependencies...
✔ Success!
Locking [dev-packages] dependencies...
Updated Pipfile.lock (9db8de7beceaef2b697de3312a725a4ad51317c04e348af9193707fe35a6d56b)!
Installing dependencies from Pipfile.lock (a6d56b)...
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
+ pipenv lock
Locking [packages] dependencies...
Building requirements...
Resolving dependencies...
✔ Success!
Locking [dev-packages] dependencies...
Updated Pipfile.lock (9db8de7beceaef2b697de3312a725a4ad51317c04e348af9193707fe35a6d56b)!
+ pipenv sync
Installing dependencies from Pipfile.lock (a6d56b)...
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
All dependencies are now up-to-date!
matteius commented 1 year ago

Possibly related: https://github.com/pypa/pip/issues/10739

stewartmiles commented 1 year ago

Sorry about the delay responding to this, been quite a busy week. I'll try to find some time to try out export PIP_CHECK_BUILD_DEPENDENCIES=1 thanks for taking a look.