astral-sh / rye

a Hassle-Free Python Experience
https://rye.astral.sh
MIT License
13.6k stars 466 forks source link

Rye fails to install package `psychopy` #1266

Closed snipeso closed 2 months ago

snipeso commented 2 months ago

Steps to Reproduce

  1. create new project (mkdir repro, rye init)
  2. rye add psychopy
  3. rye sync

Expected Result

I would expect the package to be successfully installed

Actual Result

PS D:\Code\Python> mkdir repro

    Directory: D:\Code\Python

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        23/07/2024     16:20                repro

PS D:\Code\Python> cd .\repro\
PS D:\Code\Python\repro> rye init
success: Initialized project in D:\Code\Python\repro\.
  Run `rye sync` to get started
PS D:\Code\Python\repro> rye add psychopy
Added psychopy>=2023.1.3 as regular dependency
PS D:\Code\Python\repro> rye sync
Initializing new virtualenv in D:\Code\Python\repro\.venv
Python version: cpython@3.12.4
Generating production lockfile: D:\Code\Python\repro\requirements.lock
    error: subprocess-exited-with-error

    × Getting requirements to build wheel did not run successfully.
    │ exit code: 1
    ╰─> [33 lines of output]
        Traceback (most recent call last):
          File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_vendor\pyproject_hooks\_in_process\_in_process.py", line 353, in <module>
            main()
          File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_vendor\pyproject_hooks\_in_process\_in_process.py", line 335, in main
            json_out['return_val'] = hook(**hook_input['kwargs'])
                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_vendor\pyproject_hooks\_in_process\_in_process.py", line 112, in get_requires_for_build_wheel
            backend = _build_backend()
                      ^^^^^^^^^^^^^^^^
          File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_vendor\pyproject_hooks\_in_process\_in_process.py", line 77, in _build_backend
            obj = import_module(mod_path)
                  ^^^^^^^^^^^^^^^^^^^^^^^
          File "C:\Users\colas\.rye\py\cpython@3.12.4\Lib\importlib\__init__.py", line 90, in import_module
            return _bootstrap._gcd_import(name[level:], package, level)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
          File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
          File "<frozen importlib._bootstrap>", line 1310, in _find_and_load_unlocked
          File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
          File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
          File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
          File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
          File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
          File "<frozen importlib._bootstrap_external>", line 995, in exec_module
          File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
          File "C:\Users\colas\AppData\Local\Temp\pip-build-env-uxt7yxg1\overlay\Lib\site-packages\setuptools\__init__.py", line 16, in <module>
            import setuptools.version
          File "C:\Users\colas\AppData\Local\Temp\pip-build-env-uxt7yxg1\overlay\Lib\site-packages\setuptools\version.py", line 1, in <module>
            import pkg_resources
          File "C:\Users\colas\AppData\Local\Temp\pip-build-env-uxt7yxg1\overlay\Lib\site-packages\pkg_resources\__init__.py", line 2172, in <module>
            register_finder(pkgutil.ImpImporter, find_on_path)
                            ^^^^^^^^^^^^^^^^^^^
        AttributeError: module 'pkgutil' has no attribute 'ImpImporter'. Did you mean: 'zipimporter'?
        [end of output]

    note: This error originates from a subprocess, and is likely not a problem with pip.
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Scripts\pip-compile.exe\__main__.py", line 7, in <module>
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\click\core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\click\core.py", line 1078, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\click\core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\click\core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\click\decorators.py", line 33, in new_func
    return f(get_current_context(), *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\piptools\scripts\compile.py", line 659, in cli
    results = resolver.resolve(max_rounds=max_rounds)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\piptools\resolver.py", line 604, in resolve
    is_resolved = self._do_resolve(
                  ^^^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\piptools\resolver.py", line 636, in _do_resolve
    resolver.resolve(
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_internal\resolution\resolvelib\resolver.py", line 95, in resolve
    result = self._result = resolver.resolve(
                            ^^^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_vendor\resolvelib\resolvers.py", line 546, in resolve
    state = resolution.resolve(requirements, max_rounds=max_rounds)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_vendor\resolvelib\resolvers.py", line 427, in resolve
    failure_causes = self._attempt_to_pin_criterion(name)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_vendor\resolvelib\resolvers.py", line 239, in _attempt_to_pin_criterion
    criteria = self._get_updated_criteria(candidate)
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_vendor\resolvelib\resolvers.py", line 230, in _get_updated_criteria
    self._add_to_criteria(criteria, requirement, parent=candidate)
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_vendor\resolvelib\resolvers.py", line 173, in _add_to_criteria
    if not criterion.candidates:
           ^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_vendor\resolvelib\structs.py", line 156, in __bool__
    return bool(self._sequence)
           ^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_internal\resolution\resolvelib\found_candidates.py", line 155, in __bool__
    return any(self)
           ^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_internal\resolution\resolvelib\found_candidates.py", line 143, in <genexpr>
    return (c for c in iterator if id(c) not in self._incompatible_ids)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_internal\resolution\resolvelib\found_candidates.py", line 47, in _iter_built
    candidate = func()
                ^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_internal\resolution\resolvelib\factory.py", line 182, in _make_candidate_from_link
    base: Optional[BaseCandidate] = self._make_base_candidate_from_link(
                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_internal\resolution\resolvelib\factory.py", line 228, in _make_base_candidate_from_link
    self._link_candidate_cache[link] = LinkCandidate(
                                       ^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_internal\resolution\resolvelib\candidates.py", line 293, in __init__
    super().__init__(
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_internal\resolution\resolvelib\candidates.py", line 156, in __init__
    self.dist = self._prepare()
                ^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_internal\resolution\resolvelib\candidates.py", line 225, in _prepare
    dist = self._prepare_distribution()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_internal\resolution\resolvelib\candidates.py", line 304, in _prepare_distribution
    return preparer.prepare_linked_requirement(self._ireq, parallel_builds=True)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_internal\operations\prepare.py", line 525, in prepare_linked_requirement
    return self._prepare_linked_requirement(req, parallel_builds)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_internal\operations\prepare.py", line 640, in _prepare_linked_requirement
    dist = _get_prepared_distribution(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_internal\operations\prepare.py", line 71, in _get_prepared_distribution
    abstract_dist.prepare_distribution_metadata(
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_internal\distributions\sdist.py", line 54, in prepare_distribution_metadata
    self._install_build_reqs(finder)
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_internal\distributions\sdist.py", line 124, in _install_build_reqs
    build_reqs = self._get_build_requires_wheel()
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_internal\distributions\sdist.py", line 101, in _get_build_requires_wheel
    return backend.get_requires_for_build_wheel()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_internal\utils\misc.py", line 751, in get_requires_for_build_wheel
    return super().get_requires_for_build_wheel(config_settings=cs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_vendor\pyproject_hooks\_impl.py", line 166, in get_requires_for_build_wheel
    return self._call_hook('get_requires_for_build_wheel', {
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_vendor\pyproject_hooks\_impl.py", line 311, in _call_hook
    self._subprocess_runner(
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_internal\utils\subprocess.py", line 252, in runner
    call_subprocess(
  File "C:\Users\colas\.rye\pip-tools\cpython@3.12\Lib\site-packages\pip\_internal\utils\subprocess.py", line 224, in call_subprocess
    raise error
pip._internal.exceptions.InstallationSubprocessError: Getting requirements to build wheel exited with 1
error: could not write production lockfile for project

Caused by:
    failed to generate lockfile

Version Info

PS D:\Code\Python\repro> rye --version
rye 0.37.0
commit: 0.37.0 (09b67c469 2024-07-20)
platform: windows (x86_64)
self-python: cpython@3.12.4
symlink support: true
uv enabled: false

note: it didn't work with uv enable either.

Stacktrace

No response

snipeso commented 2 months ago

Thanks for taking a look!

charliermarsh commented 2 months ago

Can you include the output with uv enabled?

snipeso commented 2 months ago

Sure, here it is:



    Directory: D:\Code\Python

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        23/07/2024     16:51                repro2

PS D:\Code\Python> cd repro2
PS D:\Code\Python\repro2> rye init
success: Initialized project in D:\Code\Python\repro2\.
  Run `rye sync` to get started
PS D:\Code\Python\repro2> rye --version
rye 0.37.0
commit: 0.37.0 (09b67c469 2024-07-20)
platform: windows (x86_64)
self-python: cpython@3.12.4
symlink support: true
uv enabled: true
PS D:\Code\Python\repro2> rye add psychopy
Initializing new virtualenv in D:\Code\Python\repro2\.venv
Python version: cpython@3.12.4
Added psychopy>=2023.1.3 as regular dependency
Reusing already existing virtualenv
Generating production lockfile: \\?\D:\Code\Python\repro2\requirements.lock
Generating dev lockfile: \\?\D:\Code\Python\repro2\requirements-dev.lock
Installing dependencies
Resolved 93 packages in 42ms
error: Failed to prepare distributions
  Caused by: Failed to fetch wheel: numpy==1.23.5
  Caused by: Failed to build: `numpy==1.23.5`
  Caused by: Build backend failed to determine extra requires with `build_wheel()` with exit code: 1
--- stdout:

--- stderr:
Traceback (most recent call last):
  File "<string>", line 8, in <module>
  File "C:\Users\colas\AppData\Local\uv\cache\builds-v0\.tmpi1vHtE\Lib\site-packages\setuptools\__init__.py", line 10, in <module>
    import distutils.core
ModuleNotFoundError: No module named 'distutils'
---
error: Installation of dependencies failed in venv at \\?\D:\Code\Python\repro2\.venv. uv exited with status: exit code: 2
PS D:\Code\Python\repro2> rye sync
Reusing already existing virtualenv
Generating production lockfile: D:\Code\Python\repro2\requirements.lock
Generating dev lockfile: D:\Code\Python\repro2\requirements-dev.lock
Installing dependencies
Resolved 93 packages in 47ms
error: Failed to prepare distributions
  Caused by: Failed to fetch wheel: numpy==1.23.5
  Caused by: Failed to build: `numpy==1.23.5`
  Caused by: Build backend failed to determine extra requires with `build_wheel()` with exit code: 1
--- stdout:

--- stderr:
Traceback (most recent call last):
  File "<string>", line 8, in <module>
  File "C:\Users\colas\AppData\Local\uv\cache\builds-v0\.tmpb0Btq2\Lib\site-packages\setuptools\__init__.py", line 10, in <module>
    import distutils.core
ModuleNotFoundError: No module named 'distutils'
---
error: Installation of dependencies failed in venv at D:\Code\Python\repro2\.venv. uv exited with status: exit code: 2
PS D:\Code\Python\repro2>```
charliermarsh commented 2 months ago

Thanks. I don't think that version of NumPy supports Python 3.12 -- I get the same error with pip (python -m pip install numpy==1.23.5), so it seems correct to me! I'm not sure why pip-tools is failing. That also looks like some kind of version incompatibility, but the uv error looks right. You may want to downgrade Python or upgrade NumPy.

snipeso commented 2 months ago

Ok, so it seems like its a problem with psychopy. Thanks for taking a look!