compile_pip_requirements + 3.11 failing on some packages #1140

Description

@aschleck

🐞 bug report

Affected Rule

The issue is caused by the rule: compile_pip_requirements

Is this a regression?

I don't think this is a regression in rules_python, but this works with Python 3.10 and does not work with 3.11.

Description

When I try to use compile_pip_requirements to recompile a lockfile with certain packages it cannot handle it. I would have thought the libraries were wrong, however a) pip install works in a non-Bazel venv and b) if I manually resolve the lockfile then pip_parse successfully can parse it and the dependencies work in my py_binary targets.

This seems similar-but-different to #914, but enable_implicit_namespace_pkgs does not seem to be an argument to compile_pip_requirements and anyway pip_parse has no problem parsing this package. Plus adding or removing --incompatible_default_to_explicit_init_py has no effect on this problem.

🔬 Minimal Reproduction

WORKSPACE:

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "rules_python",
sha256 = "a644da969b6824cc87f8fe7b18101a8a6c57da5db39caa6566ec6109f37d2141",
strip_prefix = "rules_python-0.20.0",
url = "https://github.com/bazelbuild/rules_python/releases/download/0.20.0/rules_python-0.20.0.tar.gz",
)
load("@rules_python//python:repositories.bzl", "py_repositories")
py_repositories()
load("@rules_python//python:repositories.bzl", "python_register_toolchains")
python_register_toolchains(
name = "python3_11",
python_version = "3.11",
)
load("@python3_11//:defs.bzl", "interpreter")
load("@rules_python//python:pip.bzl", "pip_parse")
pip_parse(
name = "python_deps",
python_interpreter_target = interpreter,
requirements_lock = "//:requirements_actual.txt",
)
load("@python_deps//:requirements.bzl", install_deps = "install_deps")
install_deps()

BUILD:

load("@rules_python//python:pip.bzl", "compile_pip_requirements")
package(default_visibility = ["//visibility:public"])
compile_pip_requirements(
name = "requirements_lock",
extra_args = ["--allow-unsafe"],
)

requirements_lock.in:

docopt==0.6.2

Then run bazel run //:requirements_lock.update

If you create requirements_actual.txt with the same content as requirements_lock.in, then you can bazel build @python_deps_docopt//:pkg or use it as a dependency of a py_binary target succesfully.

🔥 Exception or Error


Updating ./requirements_lock.txt
WARNING: the legacy dependency resolver is deprecated and will be removed in future versions of pip-tools. The default resolver will be changed to 'backtracking' in pip-tools 7.0.0. Specify --resolver=backtracking to silence this warning.
error: subprocess-exited-with-error
× python setup.py egg_info did not run successfully.
│ exit code: 1
╰─> [6 lines of output]
Traceback (most recent call last):
File "", line 2, in File "", line 34, in File "/tmp/pip-resolver-fahvht28/docopt/setup.py", line 3, in from docopt import __version__
ModuleNotFoundError: No module named 'docopt'
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
Traceback (most recent call last):
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/build/metadata_legacy.py", line 64, in generate_metadata
call_subprocess(
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/utils/subprocess.py", line 224, in call_subprocess
raise error
pip._internal.exceptions.InstallationSubprocessError: python setup.py egg_info exited with 1
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/rules_python/python/pip_install/tools/dependency_resolver/dependency_resolver.py", line 143, in cli()
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1137, in __call__
return self.main(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1062, in main
rv = self.invoke(ctx)
^^^^^^^^^^^^^^^^
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1404, in invoke
return ctx.invoke(self.callback, **ctx.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 763, in invoke
return __callback(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/decorators.py", line 26, in new_func
return f(get_current_context(), *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/scripts/compile.py", line 580, in cli
results = resolver.resolve(max_rounds=max_rounds)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 253, in resolve
has_changed, best_matches = self._resolve_one_round()
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 343, in _resolve_one_round
their_constraints.extend(self._iter_dependencies(best_match))
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 456, in _iter_dependencies
dependencies = self.repository.get_dependencies(ireq)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/local.py", line 87, in get_dependencies
return self.repository.get_dependencies(ireq)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/pypi.py", line 238, in get_dependencies
self._dependencies_cache[ireq] = self.resolve_reqs(
^^^^^^^^^^^^^^^^^^
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/pypi.py", line 201, in resolve_reqs
results = resolver._resolve_one(reqset, ireq)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/resolution/legacy/resolver.py", line 509, in _resolve_one
dist = self._get_dist_for(req_to_install)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/resolution/legacy/resolver.py", line 462, in _get_dist_for
dist = self.preparer.prepare_linked_requirement(req)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 491, in prepare_linked_requirement
return self._prepare_linked_requirement(req, parallel_builds)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 577, in _prepare_linked_requirement
dist = _get_prepared_distribution(
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 69, in _get_prepared_distribution
abstract_dist.prepare_distribution_metadata(
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/distributions/sdist.py", line 61, in prepare_distribution_metadata
self.req.prepare_metadata()
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/req/req_install.py", line 541, in prepare_metadata
self.metadata_directory = generate_metadata_legacy(
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/build/metadata_legacy.py", line 71, in generate_metadata
raise MetadataGenerationFailed(package_details=details) from error
pip._internal.exceptions.MetadataGenerationFailed: metadata generation failed

🌍 Your Environment

Operating System:


DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.2 LTS"

Output of bazel version:


Bazelisk version: v1.14.0
Build label: 6.1.1
Build target: bazel-out/k8-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Wed Mar 15 15:44:56 2023 (1678895096)
Build timestamp: 1678895096
Build timestamp as int: 1678895096

Rules_python version:


0.20.0

Anything else relevant?

I'm also seeing this with another package, umi-tools, though there are some other 3.10->3.11 problems there I think so I felt docopt was a cleaner demonstration.

PS thank you so much for maintaining this project! Super amazing to have so much complexity hidden behind relatively simple rules.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Can Close?Will close in 30 days if there is no new activity

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
       blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      
      Skip to content

      compile_pip_requirements + 3.11 failing on some packages #1140

      Description

      @aschleck

      🐞 bug report

      Affected Rule

      The issue is caused by the rule: compile_pip_requirements

      Is this a regression?

      I don't think this is a regression in rules_python, but this works with Python 3.10 and does not work with 3.11.

      Description

      When I try to use compile_pip_requirements to recompile a lockfile with certain packages it cannot handle it. I would have thought the libraries were wrong, however a) pip install works in a non-Bazel venv and b) if I manually resolve the lockfile then pip_parse successfully can parse it and the dependencies work in my py_binary targets.

      This seems similar-but-different to #914, but enable_implicit_namespace_pkgs does not seem to be an argument to compile_pip_requirements and anyway pip_parse has no problem parsing this package. Plus adding or removing --incompatible_default_to_explicit_init_py has no effect on this problem.

      🔬 Minimal Reproduction

      WORKSPACE:

      load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
      http_archive(
      name = "rules_python",
      sha256 = "a644da969b6824cc87f8fe7b18101a8a6c57da5db39caa6566ec6109f37d2141",
      strip_prefix = "rules_python-0.20.0",
      url = "https://github.com/bazelbuild/rules_python/releases/download/0.20.0/rules_python-0.20.0.tar.gz",
      )
      load("@rules_python//python:repositories.bzl", "py_repositories")
      py_repositories()
      load("@rules_python//python:repositories.bzl", "python_register_toolchains")
      python_register_toolchains(
      name = "python3_11",
      python_version = "3.11",
      )
      load("@python3_11//:defs.bzl", "interpreter")
      load("@rules_python//python:pip.bzl", "pip_parse")
      pip_parse(
      name = "python_deps",
      python_interpreter_target = interpreter,
      requirements_lock = "//:requirements_actual.txt",
      )
      load("@python_deps//:requirements.bzl", install_deps = "install_deps")
      install_deps()
      

      BUILD:

      load("@rules_python//python:pip.bzl", "compile_pip_requirements")
      package(default_visibility = ["//visibility:public"])
      compile_pip_requirements(
      name = "requirements_lock",
      extra_args = ["--allow-unsafe"],
      )
      

      requirements_lock.in:

      docopt==0.6.2
      

      Then run bazel run //:requirements_lock.update

      If you create requirements_actual.txt with the same content as requirements_lock.in, then you can bazel build @python_deps_docopt//:pkg or use it as a dependency of a py_binary target succesfully.

      🔥 Exception or Error

      
      Updating ./requirements_lock.txt
      WARNING: the legacy dependency resolver is deprecated and will be removed in future versions of pip-tools. The default resolver will be changed to 'backtracking' in pip-tools 7.0.0. Specify --resolver=backtracking to silence this warning.
      error: subprocess-exited-with-error
      × python setup.py egg_info did not run successfully.
      │ exit code: 1
      ╰─> [6 lines of output]
      Traceback (most recent call last):
      File "", line 2, in File "", line 34, in File "/tmp/pip-resolver-fahvht28/docopt/setup.py", line 3, in from docopt import __version__
      ModuleNotFoundError: No module named 'docopt'
      [end of output]
      note: This error originates from a subprocess, and is likely not a problem with pip.
      Traceback (most recent call last):
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/build/metadata_legacy.py", line 64, in generate_metadata
      call_subprocess(
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/utils/subprocess.py", line 224, in call_subprocess
      raise error
      pip._internal.exceptions.InstallationSubprocessError: python setup.py egg_info exited with 1
      The above exception was the direct cause of the following exception:
      Traceback (most recent call last):
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/rules_python/python/pip_install/tools/dependency_resolver/dependency_resolver.py", line 143, in cli()
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1137, in __call__
      return self.main(*args, **kwargs)
      ^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1062, in main
      rv = self.invoke(ctx)
      ^^^^^^^^^^^^^^^^
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1404, in invoke
      return ctx.invoke(self.callback, **ctx.params)
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 763, in invoke
      return __callback(*args, **kwargs)
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/decorators.py", line 26, in new_func
      return f(get_current_context(), *args, **kwargs)
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/scripts/compile.py", line 580, in cli
      results = resolver.resolve(max_rounds=max_rounds)
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 253, in resolve
      has_changed, best_matches = self._resolve_one_round()
      ^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 343, in _resolve_one_round
      their_constraints.extend(self._iter_dependencies(best_match))
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 456, in _iter_dependencies
      dependencies = self.repository.get_dependencies(ireq)
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/local.py", line 87, in get_dependencies
      return self.repository.get_dependencies(ireq)
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/pypi.py", line 238, in get_dependencies
      self._dependencies_cache[ireq] = self.resolve_reqs(
      ^^^^^^^^^^^^^^^^^^
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/pypi.py", line 201, in resolve_reqs
      results = resolver._resolve_one(reqset, ireq)
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/resolution/legacy/resolver.py", line 509, in _resolve_one
      dist = self._get_dist_for(req_to_install)
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/resolution/legacy/resolver.py", line 462, in _get_dist_for
      dist = self.preparer.prepare_linked_requirement(req)
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 491, in prepare_linked_requirement
      return self._prepare_linked_requirement(req, parallel_builds)
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 577, in _prepare_linked_requirement
      dist = _get_prepared_distribution(
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 69, in _get_prepared_distribution
      abstract_dist.prepare_distribution_metadata(
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/distributions/sdist.py", line 61, in prepare_distribution_metadata
      self.req.prepare_metadata()
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/req/req_install.py", line 541, in prepare_metadata
      self.metadata_directory = generate_metadata_legacy(
      ^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/build/metadata_legacy.py", line 71, in generate_metadata
      raise MetadataGenerationFailed(package_details=details) from error
      pip._internal.exceptions.MetadataGenerationFailed: metadata generation failed
      

      🌍 Your Environment

      Operating System:

      
      DISTRIB_ID=Ubuntu
      DISTRIB_RELEASE=22.04
      DISTRIB_CODENAME=jammy
      DISTRIB_DESCRIPTION="Ubuntu 22.04.2 LTS"
      

      Output of bazel version:

      
      Bazelisk version: v1.14.0
      Build label: 6.1.1
      Build target: bazel-out/k8-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
      Build time: Wed Mar 15 15:44:56 2023 (1678895096)
      Build timestamp: 1678895096
      Build timestamp as int: 1678895096
      

      Rules_python version:

      
      0.20.0
      

      Anything else relevant?

      I'm also seeing this with another package, umi-tools, though there are some other 3.10->3.11 problems there I think so I felt docopt was a cleaner demonstration.

      PS thank you so much for maintaining this project! Super amazing to have so much complexity hidden behind relatively simple rules.

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        Can Close?Will close in 30 days if there is no new activity

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
          Skip to content

          compile_pip_requirements + 3.11 failing on some packages #1140

          Description

          @aschleck

          🐞 bug report

          Affected Rule

          The issue is caused by the rule: compile_pip_requirements

          Is this a regression?

          I don't think this is a regression in rules_python, but this works with Python 3.10 and does not work with 3.11.

          Description

          When I try to use compile_pip_requirements to recompile a lockfile with certain packages it cannot handle it. I would have thought the libraries were wrong, however a) pip install works in a non-Bazel venv and b) if I manually resolve the lockfile then pip_parse successfully can parse it and the dependencies work in my py_binary targets.

          This seems similar-but-different to #914, but enable_implicit_namespace_pkgs does not seem to be an argument to compile_pip_requirements and anyway pip_parse has no problem parsing this package. Plus adding or removing --incompatible_default_to_explicit_init_py has no effect on this problem.

          🔬 Minimal Reproduction

          WORKSPACE:

          load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
          http_archive(
          name = "rules_python",
          sha256 = "a644da969b6824cc87f8fe7b18101a8a6c57da5db39caa6566ec6109f37d2141",
          strip_prefix = "rules_python-0.20.0",
          url = "https://github.com/bazelbuild/rules_python/releases/download/0.20.0/rules_python-0.20.0.tar.gz",
          )
          load("@rules_python//python:repositories.bzl", "py_repositories")
          py_repositories()
          load("@rules_python//python:repositories.bzl", "python_register_toolchains")
          python_register_toolchains(
          name = "python3_11",
          python_version = "3.11",
          )
          load("@python3_11//:defs.bzl", "interpreter")
          load("@rules_python//python:pip.bzl", "pip_parse")
          pip_parse(
          name = "python_deps",
          python_interpreter_target = interpreter,
          requirements_lock = "//:requirements_actual.txt",
          )
          load("@python_deps//:requirements.bzl", install_deps = "install_deps")
          install_deps()
          

          BUILD:

          load("@rules_python//python:pip.bzl", "compile_pip_requirements")
          package(default_visibility = ["//visibility:public"])
          compile_pip_requirements(
          name = "requirements_lock",
          extra_args = ["--allow-unsafe"],
          )
          

          requirements_lock.in:

          docopt==0.6.2
          

          Then run bazel run //:requirements_lock.update

          If you create requirements_actual.txt with the same content as requirements_lock.in, then you can bazel build @python_deps_docopt//:pkg or use it as a dependency of a py_binary target succesfully.

          🔥 Exception or Error

          
          Updating ./requirements_lock.txt
          WARNING: the legacy dependency resolver is deprecated and will be removed in future versions of pip-tools. The default resolver will be changed to 'backtracking' in pip-tools 7.0.0. Specify --resolver=backtracking to silence this warning.
          error: subprocess-exited-with-error
          × python setup.py egg_info did not run successfully.
          │ exit code: 1
          ╰─> [6 lines of output]
          Traceback (most recent call last):
          File "", line 2, in File "", line 34, in File "/tmp/pip-resolver-fahvht28/docopt/setup.py", line 3, in from docopt import __version__
          ModuleNotFoundError: No module named 'docopt'
          [end of output]
          note: This error originates from a subprocess, and is likely not a problem with pip.
          Traceback (most recent call last):
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/build/metadata_legacy.py", line 64, in generate_metadata
          call_subprocess(
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/utils/subprocess.py", line 224, in call_subprocess
          raise error
          pip._internal.exceptions.InstallationSubprocessError: python setup.py egg_info exited with 1
          The above exception was the direct cause of the following exception:
          Traceback (most recent call last):
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/rules_python/python/pip_install/tools/dependency_resolver/dependency_resolver.py", line 143, in cli()
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1137, in __call__
          return self.main(*args, **kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1062, in main
          rv = self.invoke(ctx)
          ^^^^^^^^^^^^^^^^
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1404, in invoke
          return ctx.invoke(self.callback, **ctx.params)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 763, in invoke
          return __callback(*args, **kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/decorators.py", line 26, in new_func
          return f(get_current_context(), *args, **kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/scripts/compile.py", line 580, in cli
          results = resolver.resolve(max_rounds=max_rounds)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 253, in resolve
          has_changed, best_matches = self._resolve_one_round()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 343, in _resolve_one_round
          their_constraints.extend(self._iter_dependencies(best_match))
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 456, in _iter_dependencies
          dependencies = self.repository.get_dependencies(ireq)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/local.py", line 87, in get_dependencies
          return self.repository.get_dependencies(ireq)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/pypi.py", line 238, in get_dependencies
          self._dependencies_cache[ireq] = self.resolve_reqs(
          ^^^^^^^^^^^^^^^^^^
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/pypi.py", line 201, in resolve_reqs
          results = resolver._resolve_one(reqset, ireq)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/resolution/legacy/resolver.py", line 509, in _resolve_one
          dist = self._get_dist_for(req_to_install)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/resolution/legacy/resolver.py", line 462, in _get_dist_for
          dist = self.preparer.prepare_linked_requirement(req)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 491, in prepare_linked_requirement
          return self._prepare_linked_requirement(req, parallel_builds)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 577, in _prepare_linked_requirement
          dist = _get_prepared_distribution(
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 69, in _get_prepared_distribution
          abstract_dist.prepare_distribution_metadata(
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/distributions/sdist.py", line 61, in prepare_distribution_metadata
          self.req.prepare_metadata()
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/req/req_install.py", line 541, in prepare_metadata
          self.metadata_directory = generate_metadata_legacy(
          ^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/build/metadata_legacy.py", line 71, in generate_metadata
          raise MetadataGenerationFailed(package_details=details) from error
          pip._internal.exceptions.MetadataGenerationFailed: metadata generation failed
          

          🌍 Your Environment

          Operating System:

          
          DISTRIB_ID=Ubuntu
          DISTRIB_RELEASE=22.04
          DISTRIB_CODENAME=jammy
          DISTRIB_DESCRIPTION="Ubuntu 22.04.2 LTS"
          

          Output of bazel version:

          
          Bazelisk version: v1.14.0
          Build label: 6.1.1
          Build target: bazel-out/k8-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
          Build time: Wed Mar 15 15:44:56 2023 (1678895096)
          Build timestamp: 1678895096
          Build timestamp as int: 1678895096
          

          Rules_python version:

          
          0.20.0
          

          Anything else relevant?

          I'm also seeing this with another package, umi-tools, though there are some other 3.10->3.11 problems there I think so I felt docopt was a cleaner demonstration.

          PS thank you so much for maintaining this project! Super amazing to have so much complexity hidden behind relatively simple rules.

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            Can Close?Will close in 30 days if there is no new activity

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              compile_pip_requirements + 3.11 failing on some packages #1140

              Description

              @aschleck

              🐞 bug report

              Affected Rule

              The issue is caused by the rule: compile_pip_requirements

              Is this a regression?

              I don't think this is a regression in rules_python, but this works with Python 3.10 and does not work with 3.11.

              Description

              When I try to use compile_pip_requirements to recompile a lockfile with certain packages it cannot handle it. I would have thought the libraries were wrong, however a) pip install works in a non-Bazel venv and b) if I manually resolve the lockfile then pip_parse successfully can parse it and the dependencies work in my py_binary targets.

              This seems similar-but-different to #914, but enable_implicit_namespace_pkgs does not seem to be an argument to compile_pip_requirements and anyway pip_parse has no problem parsing this package. Plus adding or removing --incompatible_default_to_explicit_init_py has no effect on this problem.

              🔬 Minimal Reproduction

              WORKSPACE:

              load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
              http_archive(
              name = "rules_python",
              sha256 = "a644da969b6824cc87f8fe7b18101a8a6c57da5db39caa6566ec6109f37d2141",
              strip_prefix = "rules_python-0.20.0",
              url = "https://github.com/bazelbuild/rules_python/releases/download/0.20.0/rules_python-0.20.0.tar.gz",
              )
              load("@rules_python//python:repositories.bzl", "py_repositories")
              py_repositories()
              load("@rules_python//python:repositories.bzl", "python_register_toolchains")
              python_register_toolchains(
              name = "python3_11",
              python_version = "3.11",
              )
              load("@python3_11//:defs.bzl", "interpreter")
              load("@rules_python//python:pip.bzl", "pip_parse")
              pip_parse(
              name = "python_deps",
              python_interpreter_target = interpreter,
              requirements_lock = "//:requirements_actual.txt",
              )
              load("@python_deps//:requirements.bzl", install_deps = "install_deps")
              install_deps()
              

              BUILD:

              load("@rules_python//python:pip.bzl", "compile_pip_requirements")
              package(default_visibility = ["//visibility:public"])
              compile_pip_requirements(
              name = "requirements_lock",
              extra_args = ["--allow-unsafe"],
              )
              

              requirements_lock.in:

              docopt==0.6.2
              

              Then run bazel run //:requirements_lock.update

              If you create requirements_actual.txt with the same content as requirements_lock.in, then you can bazel build @python_deps_docopt//:pkg or use it as a dependency of a py_binary target succesfully.

              🔥 Exception or Error

              
              Updating ./requirements_lock.txt
              WARNING: the legacy dependency resolver is deprecated and will be removed in future versions of pip-tools. The default resolver will be changed to 'backtracking' in pip-tools 7.0.0. Specify --resolver=backtracking to silence this warning.
              error: subprocess-exited-with-error
              × python setup.py egg_info did not run successfully.
              │ exit code: 1
              ╰─> [6 lines of output]
              Traceback (most recent call last):
              File "", line 2, in File "", line 34, in File "/tmp/pip-resolver-fahvht28/docopt/setup.py", line 3, in from docopt import __version__
              ModuleNotFoundError: No module named 'docopt'
              [end of output]
              note: This error originates from a subprocess, and is likely not a problem with pip.
              Traceback (most recent call last):
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/build/metadata_legacy.py", line 64, in generate_metadata
              call_subprocess(
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/utils/subprocess.py", line 224, in call_subprocess
              raise error
              pip._internal.exceptions.InstallationSubprocessError: python setup.py egg_info exited with 1
              The above exception was the direct cause of the following exception:
              Traceback (most recent call last):
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/rules_python/python/pip_install/tools/dependency_resolver/dependency_resolver.py", line 143, in cli()
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1137, in __call__
              return self.main(*args, **kwargs)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1062, in main
              rv = self.invoke(ctx)
              ^^^^^^^^^^^^^^^^
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1404, in invoke
              return ctx.invoke(self.callback, **ctx.params)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 763, in invoke
              return __callback(*args, **kwargs)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/decorators.py", line 26, in new_func
              return f(get_current_context(), *args, **kwargs)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/scripts/compile.py", line 580, in cli
              results = resolver.resolve(max_rounds=max_rounds)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 253, in resolve
              has_changed, best_matches = self._resolve_one_round()
              ^^^^^^^^^^^^^^^^^^^^^^^^^
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 343, in _resolve_one_round
              their_constraints.extend(self._iter_dependencies(best_match))
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 456, in _iter_dependencies
              dependencies = self.repository.get_dependencies(ireq)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/local.py", line 87, in get_dependencies
              return self.repository.get_dependencies(ireq)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/pypi.py", line 238, in get_dependencies
              self._dependencies_cache[ireq] = self.resolve_reqs(
              ^^^^^^^^^^^^^^^^^^
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/pypi.py", line 201, in resolve_reqs
              results = resolver._resolve_one(reqset, ireq)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/resolution/legacy/resolver.py", line 509, in _resolve_one
              dist = self._get_dist_for(req_to_install)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/resolution/legacy/resolver.py", line 462, in _get_dist_for
              dist = self.preparer.prepare_linked_requirement(req)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 491, in prepare_linked_requirement
              return self._prepare_linked_requirement(req, parallel_builds)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 577, in _prepare_linked_requirement
              dist = _get_prepared_distribution(
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 69, in _get_prepared_distribution
              abstract_dist.prepare_distribution_metadata(
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/distributions/sdist.py", line 61, in prepare_distribution_metadata
              self.req.prepare_metadata()
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/req/req_install.py", line 541, in prepare_metadata
              self.metadata_directory = generate_metadata_legacy(
              ^^^^^^^^^^^^^^^^^^^^^^^^^
              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/build/metadata_legacy.py", line 71, in generate_metadata
              raise MetadataGenerationFailed(package_details=details) from error
              pip._internal.exceptions.MetadataGenerationFailed: metadata generation failed
              

              🌍 Your Environment

              Operating System:

              
              DISTRIB_ID=Ubuntu
              DISTRIB_RELEASE=22.04
              DISTRIB_CODENAME=jammy
              DISTRIB_DESCRIPTION="Ubuntu 22.04.2 LTS"
              

              Output of bazel version:

              
              Bazelisk version: v1.14.0
              Build label: 6.1.1
              Build target: bazel-out/k8-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
              Build time: Wed Mar 15 15:44:56 2023 (1678895096)
              Build timestamp: 1678895096
              Build timestamp as int: 1678895096
              

              Rules_python version:

              
              0.20.0
              

              Anything else relevant?

              I'm also seeing this with another package, umi-tools, though there are some other 3.10->3.11 problems there I think so I felt docopt was a cleaner demonstration.

              PS thank you so much for maintaining this project! Super amazing to have so much complexity hidden behind relatively simple rules.

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                Can Close?Will close in 30 days if there is no new activity

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
                  Skip to content

                  compile_pip_requirements + 3.11 failing on some packages #1140

                  Description

                  @aschleck

                  🐞 bug report

                  Affected Rule

                  The issue is caused by the rule: compile_pip_requirements

                  Is this a regression?

                  I don't think this is a regression in rules_python, but this works with Python 3.10 and does not work with 3.11.

                  Description

                  When I try to use compile_pip_requirements to recompile a lockfile with certain packages it cannot handle it. I would have thought the libraries were wrong, however a) pip install works in a non-Bazel venv and b) if I manually resolve the lockfile then pip_parse successfully can parse it and the dependencies work in my py_binary targets.

                  This seems similar-but-different to #914, but enable_implicit_namespace_pkgs does not seem to be an argument to compile_pip_requirements and anyway pip_parse has no problem parsing this package. Plus adding or removing --incompatible_default_to_explicit_init_py has no effect on this problem.

                  🔬 Minimal Reproduction

                  WORKSPACE:

                  load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
                  http_archive(
                  name = "rules_python",
                  sha256 = "a644da969b6824cc87f8fe7b18101a8a6c57da5db39caa6566ec6109f37d2141",
                  strip_prefix = "rules_python-0.20.0",
                  url = "https://github.com/bazelbuild/rules_python/releases/download/0.20.0/rules_python-0.20.0.tar.gz",
                  )
                  load("@rules_python//python:repositories.bzl", "py_repositories")
                  py_repositories()
                  load("@rules_python//python:repositories.bzl", "python_register_toolchains")
                  python_register_toolchains(
                  name = "python3_11",
                  python_version = "3.11",
                  )
                  load("@python3_11//:defs.bzl", "interpreter")
                  load("@rules_python//python:pip.bzl", "pip_parse")
                  pip_parse(
                  name = "python_deps",
                  python_interpreter_target = interpreter,
                  requirements_lock = "//:requirements_actual.txt",
                  )
                  load("@python_deps//:requirements.bzl", install_deps = "install_deps")
                  install_deps()
                  

                  BUILD:

                  load("@rules_python//python:pip.bzl", "compile_pip_requirements")
                  package(default_visibility = ["//visibility:public"])
                  compile_pip_requirements(
                  name = "requirements_lock",
                  extra_args = ["--allow-unsafe"],
                  )
                  

                  requirements_lock.in:

                  docopt==0.6.2
                  

                  Then run bazel run //:requirements_lock.update

                  If you create requirements_actual.txt with the same content as requirements_lock.in, then you can bazel build @python_deps_docopt//:pkg or use it as a dependency of a py_binary target succesfully.

                  🔥 Exception or Error

                  
                  Updating ./requirements_lock.txt
                  WARNING: the legacy dependency resolver is deprecated and will be removed in future versions of pip-tools. The default resolver will be changed to 'backtracking' in pip-tools 7.0.0. Specify --resolver=backtracking to silence this warning.
                  error: subprocess-exited-with-error
                  × python setup.py egg_info did not run successfully.
                  │ exit code: 1
                  ╰─> [6 lines of output]
                  Traceback (most recent call last):
                  File "", line 2, in File "", line 34, in File "/tmp/pip-resolver-fahvht28/docopt/setup.py", line 3, in from docopt import __version__
                  ModuleNotFoundError: No module named 'docopt'
                  [end of output]
                  note: This error originates from a subprocess, and is likely not a problem with pip.
                  Traceback (most recent call last):
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/build/metadata_legacy.py", line 64, in generate_metadata
                  call_subprocess(
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/utils/subprocess.py", line 224, in call_subprocess
                  raise error
                  pip._internal.exceptions.InstallationSubprocessError: python setup.py egg_info exited with 1
                  The above exception was the direct cause of the following exception:
                  Traceback (most recent call last):
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/rules_python/python/pip_install/tools/dependency_resolver/dependency_resolver.py", line 143, in cli()
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1137, in __call__
                  return self.main(*args, **kwargs)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1062, in main
                  rv = self.invoke(ctx)
                  ^^^^^^^^^^^^^^^^
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1404, in invoke
                  return ctx.invoke(self.callback, **ctx.params)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 763, in invoke
                  return __callback(*args, **kwargs)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/decorators.py", line 26, in new_func
                  return f(get_current_context(), *args, **kwargs)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/scripts/compile.py", line 580, in cli
                  results = resolver.resolve(max_rounds=max_rounds)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 253, in resolve
                  has_changed, best_matches = self._resolve_one_round()
                  ^^^^^^^^^^^^^^^^^^^^^^^^^
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 343, in _resolve_one_round
                  their_constraints.extend(self._iter_dependencies(best_match))
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 456, in _iter_dependencies
                  dependencies = self.repository.get_dependencies(ireq)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/local.py", line 87, in get_dependencies
                  return self.repository.get_dependencies(ireq)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/pypi.py", line 238, in get_dependencies
                  self._dependencies_cache[ireq] = self.resolve_reqs(
                  ^^^^^^^^^^^^^^^^^^
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/pypi.py", line 201, in resolve_reqs
                  results = resolver._resolve_one(reqset, ireq)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/resolution/legacy/resolver.py", line 509, in _resolve_one
                  dist = self._get_dist_for(req_to_install)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/resolution/legacy/resolver.py", line 462, in _get_dist_for
                  dist = self.preparer.prepare_linked_requirement(req)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 491, in prepare_linked_requirement
                  return self._prepare_linked_requirement(req, parallel_builds)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 577, in _prepare_linked_requirement
                  dist = _get_prepared_distribution(
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 69, in _get_prepared_distribution
                  abstract_dist.prepare_distribution_metadata(
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/distributions/sdist.py", line 61, in prepare_distribution_metadata
                  self.req.prepare_metadata()
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/req/req_install.py", line 541, in prepare_metadata
                  self.metadata_directory = generate_metadata_legacy(
                  ^^^^^^^^^^^^^^^^^^^^^^^^^
                  File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/build/metadata_legacy.py", line 71, in generate_metadata
                  raise MetadataGenerationFailed(package_details=details) from error
                  pip._internal.exceptions.MetadataGenerationFailed: metadata generation failed
                  

                  🌍 Your Environment

                  Operating System:

                  
                  DISTRIB_ID=Ubuntu
                  DISTRIB_RELEASE=22.04
                  DISTRIB_CODENAME=jammy
                  DISTRIB_DESCRIPTION="Ubuntu 22.04.2 LTS"
                  

                  Output of bazel version:

                  
                  Bazelisk version: v1.14.0
                  Build label: 6.1.1
                  Build target: bazel-out/k8-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
                  Build time: Wed Mar 15 15:44:56 2023 (1678895096)
                  Build timestamp: 1678895096
                  Build timestamp as int: 1678895096
                  

                  Rules_python version:

                  
                  0.20.0
                  

                  Anything else relevant?

                  I'm also seeing this with another package, umi-tools, though there are some other 3.10->3.11 problems there I think so I felt docopt was a cleaner demonstration.

                  PS thank you so much for maintaining this project! Super amazing to have so much complexity hidden behind relatively simple rules.

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    Can Close?Will close in 30 days if there is no new activity

                    Type

                    No type

                    Projects

                    No projects

                      Milestone

                      No milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                      Skip to content

                      compile_pip_requirements + 3.11 failing on some packages #1140

                      Description

                      @aschleck

                      🐞 bug report

                      Affected Rule

                      The issue is caused by the rule: compile_pip_requirements

                      Is this a regression?

                      I don't think this is a regression in rules_python, but this works with Python 3.10 and does not work with 3.11.

                      Description

                      When I try to use compile_pip_requirements to recompile a lockfile with certain packages it cannot handle it. I would have thought the libraries were wrong, however a) pip install works in a non-Bazel venv and b) if I manually resolve the lockfile then pip_parse successfully can parse it and the dependencies work in my py_binary targets.

                      This seems similar-but-different to #914, but enable_implicit_namespace_pkgs does not seem to be an argument to compile_pip_requirements and anyway pip_parse has no problem parsing this package. Plus adding or removing --incompatible_default_to_explicit_init_py has no effect on this problem.

                      🔬 Minimal Reproduction

                      WORKSPACE:

                      load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
                      http_archive(
                      name = "rules_python",
                      sha256 = "a644da969b6824cc87f8fe7b18101a8a6c57da5db39caa6566ec6109f37d2141",
                      strip_prefix = "rules_python-0.20.0",
                      url = "https://github.com/bazelbuild/rules_python/releases/download/0.20.0/rules_python-0.20.0.tar.gz",
                      )
                      load("@rules_python//python:repositories.bzl", "py_repositories")
                      py_repositories()
                      load("@rules_python//python:repositories.bzl", "python_register_toolchains")
                      python_register_toolchains(
                      name = "python3_11",
                      python_version = "3.11",
                      )
                      load("@python3_11//:defs.bzl", "interpreter")
                      load("@rules_python//python:pip.bzl", "pip_parse")
                      pip_parse(
                      name = "python_deps",
                      python_interpreter_target = interpreter,
                      requirements_lock = "//:requirements_actual.txt",
                      )
                      load("@python_deps//:requirements.bzl", install_deps = "install_deps")
                      install_deps()
                      

                      BUILD:

                      load("@rules_python//python:pip.bzl", "compile_pip_requirements")
                      package(default_visibility = ["//visibility:public"])
                      compile_pip_requirements(
                      name = "requirements_lock",
                      extra_args = ["--allow-unsafe"],
                      )
                      

                      requirements_lock.in:

                      docopt==0.6.2
                      

                      Then run bazel run //:requirements_lock.update

                      If you create requirements_actual.txt with the same content as requirements_lock.in, then you can bazel build @python_deps_docopt//:pkg or use it as a dependency of a py_binary target succesfully.

                      🔥 Exception or Error

                      
                      Updating ./requirements_lock.txt
                      WARNING: the legacy dependency resolver is deprecated and will be removed in future versions of pip-tools. The default resolver will be changed to 'backtracking' in pip-tools 7.0.0. Specify --resolver=backtracking to silence this warning.
                      error: subprocess-exited-with-error
                      × python setup.py egg_info did not run successfully.
                      │ exit code: 1
                      ╰─> [6 lines of output]
                      Traceback (most recent call last):
                      File "", line 2, in File "", line 34, in File "/tmp/pip-resolver-fahvht28/docopt/setup.py", line 3, in from docopt import __version__
                      ModuleNotFoundError: No module named 'docopt'
                      [end of output]
                      note: This error originates from a subprocess, and is likely not a problem with pip.
                      Traceback (most recent call last):
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/build/metadata_legacy.py", line 64, in generate_metadata
                      call_subprocess(
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/utils/subprocess.py", line 224, in call_subprocess
                      raise error
                      pip._internal.exceptions.InstallationSubprocessError: python setup.py egg_info exited with 1
                      The above exception was the direct cause of the following exception:
                      Traceback (most recent call last):
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/rules_python/python/pip_install/tools/dependency_resolver/dependency_resolver.py", line 143, in cli()
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1137, in __call__
                      return self.main(*args, **kwargs)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1062, in main
                      rv = self.invoke(ctx)
                      ^^^^^^^^^^^^^^^^
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1404, in invoke
                      return ctx.invoke(self.callback, **ctx.params)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 763, in invoke
                      return __callback(*args, **kwargs)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/decorators.py", line 26, in new_func
                      return f(get_current_context(), *args, **kwargs)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/scripts/compile.py", line 580, in cli
                      results = resolver.resolve(max_rounds=max_rounds)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 253, in resolve
                      has_changed, best_matches = self._resolve_one_round()
                      ^^^^^^^^^^^^^^^^^^^^^^^^^
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 343, in _resolve_one_round
                      their_constraints.extend(self._iter_dependencies(best_match))
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 456, in _iter_dependencies
                      dependencies = self.repository.get_dependencies(ireq)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/local.py", line 87, in get_dependencies
                      return self.repository.get_dependencies(ireq)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/pypi.py", line 238, in get_dependencies
                      self._dependencies_cache[ireq] = self.resolve_reqs(
                      ^^^^^^^^^^^^^^^^^^
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/pypi.py", line 201, in resolve_reqs
                      results = resolver._resolve_one(reqset, ireq)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/resolution/legacy/resolver.py", line 509, in _resolve_one
                      dist = self._get_dist_for(req_to_install)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/resolution/legacy/resolver.py", line 462, in _get_dist_for
                      dist = self.preparer.prepare_linked_requirement(req)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 491, in prepare_linked_requirement
                      return self._prepare_linked_requirement(req, parallel_builds)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 577, in _prepare_linked_requirement
                      dist = _get_prepared_distribution(
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 69, in _get_prepared_distribution
                      abstract_dist.prepare_distribution_metadata(
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/distributions/sdist.py", line 61, in prepare_distribution_metadata
                      self.req.prepare_metadata()
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/req/req_install.py", line 541, in prepare_metadata
                      self.metadata_directory = generate_metadata_legacy(
                      ^^^^^^^^^^^^^^^^^^^^^^^^^
                      File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/build/metadata_legacy.py", line 71, in generate_metadata
                      raise MetadataGenerationFailed(package_details=details) from error
                      pip._internal.exceptions.MetadataGenerationFailed: metadata generation failed
                      

                      🌍 Your Environment

                      Operating System:

                      
                      DISTRIB_ID=Ubuntu
                      DISTRIB_RELEASE=22.04
                      DISTRIB_CODENAME=jammy
                      DISTRIB_DESCRIPTION="Ubuntu 22.04.2 LTS"
                      

                      Output of bazel version:

                      
                      Bazelisk version: v1.14.0
                      Build label: 6.1.1
                      Build target: bazel-out/k8-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
                      Build time: Wed Mar 15 15:44:56 2023 (1678895096)
                      Build timestamp: 1678895096
                      Build timestamp as int: 1678895096
                      

                      Rules_python version:

                      
                      0.20.0
                      

                      Anything else relevant?

                      I'm also seeing this with another package, umi-tools, though there are some other 3.10->3.11 problems there I think so I felt docopt was a cleaner demonstration.

                      PS thank you so much for maintaining this project! Super amazing to have so much complexity hidden behind relatively simple rules.

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        Can Close?Will close in 30 days if there is no new activity

                        Type

                        No type

                        Projects

                        No projects

                          Milestone

                          No milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                          Skip to content

                          compile_pip_requirements + 3.11 failing on some packages #1140

                          Description

                          @aschleck

                          🐞 bug report

                          Affected Rule

                          The issue is caused by the rule: compile_pip_requirements

                          Is this a regression?

                          I don't think this is a regression in rules_python, but this works with Python 3.10 and does not work with 3.11.

                          Description

                          When I try to use compile_pip_requirements to recompile a lockfile with certain packages it cannot handle it. I would have thought the libraries were wrong, however a) pip install works in a non-Bazel venv and b) if I manually resolve the lockfile then pip_parse successfully can parse it and the dependencies work in my py_binary targets.

                          This seems similar-but-different to #914, but enable_implicit_namespace_pkgs does not seem to be an argument to compile_pip_requirements and anyway pip_parse has no problem parsing this package. Plus adding or removing --incompatible_default_to_explicit_init_py has no effect on this problem.

                          🔬 Minimal Reproduction

                          WORKSPACE:

                          load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
                          http_archive(
                          name = "rules_python",
                          sha256 = "a644da969b6824cc87f8fe7b18101a8a6c57da5db39caa6566ec6109f37d2141",
                          strip_prefix = "rules_python-0.20.0",
                          url = "https://github.com/bazelbuild/rules_python/releases/download/0.20.0/rules_python-0.20.0.tar.gz",
                          )
                          load("@rules_python//python:repositories.bzl", "py_repositories")
                          py_repositories()
                          load("@rules_python//python:repositories.bzl", "python_register_toolchains")
                          python_register_toolchains(
                          name = "python3_11",
                          python_version = "3.11",
                          )
                          load("@python3_11//:defs.bzl", "interpreter")
                          load("@rules_python//python:pip.bzl", "pip_parse")
                          pip_parse(
                          name = "python_deps",
                          python_interpreter_target = interpreter,
                          requirements_lock = "//:requirements_actual.txt",
                          )
                          load("@python_deps//:requirements.bzl", install_deps = "install_deps")
                          install_deps()
                          

                          BUILD:

                          load("@rules_python//python:pip.bzl", "compile_pip_requirements")
                          package(default_visibility = ["//visibility:public"])
                          compile_pip_requirements(
                          name = "requirements_lock",
                          extra_args = ["--allow-unsafe"],
                          )
                          

                          requirements_lock.in:

                          docopt==0.6.2
                          

                          Then run bazel run //:requirements_lock.update

                          If you create requirements_actual.txt with the same content as requirements_lock.in, then you can bazel build @python_deps_docopt//:pkg or use it as a dependency of a py_binary target succesfully.

                          🔥 Exception or Error

                          
                          Updating ./requirements_lock.txt
                          WARNING: the legacy dependency resolver is deprecated and will be removed in future versions of pip-tools. The default resolver will be changed to 'backtracking' in pip-tools 7.0.0. Specify --resolver=backtracking to silence this warning.
                          error: subprocess-exited-with-error
                          × python setup.py egg_info did not run successfully.
                          │ exit code: 1
                          ╰─> [6 lines of output]
                          Traceback (most recent call last):
                          File "", line 2, in File "", line 34, in File "/tmp/pip-resolver-fahvht28/docopt/setup.py", line 3, in from docopt import __version__
                          ModuleNotFoundError: No module named 'docopt'
                          [end of output]
                          note: This error originates from a subprocess, and is likely not a problem with pip.
                          Traceback (most recent call last):
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/build/metadata_legacy.py", line 64, in generate_metadata
                          call_subprocess(
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/utils/subprocess.py", line 224, in call_subprocess
                          raise error
                          pip._internal.exceptions.InstallationSubprocessError: python setup.py egg_info exited with 1
                          The above exception was the direct cause of the following exception:
                          Traceback (most recent call last):
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/rules_python/python/pip_install/tools/dependency_resolver/dependency_resolver.py", line 143, in cli()
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1137, in __call__
                          return self.main(*args, **kwargs)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1062, in main
                          rv = self.invoke(ctx)
                          ^^^^^^^^^^^^^^^^
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1404, in invoke
                          return ctx.invoke(self.callback, **ctx.params)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 763, in invoke
                          return __callback(*args, **kwargs)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/decorators.py", line 26, in new_func
                          return f(get_current_context(), *args, **kwargs)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/scripts/compile.py", line 580, in cli
                          results = resolver.resolve(max_rounds=max_rounds)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 253, in resolve
                          has_changed, best_matches = self._resolve_one_round()
                          ^^^^^^^^^^^^^^^^^^^^^^^^^
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 343, in _resolve_one_round
                          their_constraints.extend(self._iter_dependencies(best_match))
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 456, in _iter_dependencies
                          dependencies = self.repository.get_dependencies(ireq)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/local.py", line 87, in get_dependencies
                          return self.repository.get_dependencies(ireq)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/pypi.py", line 238, in get_dependencies
                          self._dependencies_cache[ireq] = self.resolve_reqs(
                          ^^^^^^^^^^^^^^^^^^
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/pypi.py", line 201, in resolve_reqs
                          results = resolver._resolve_one(reqset, ireq)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/resolution/legacy/resolver.py", line 509, in _resolve_one
                          dist = self._get_dist_for(req_to_install)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/resolution/legacy/resolver.py", line 462, in _get_dist_for
                          dist = self.preparer.prepare_linked_requirement(req)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 491, in prepare_linked_requirement
                          return self._prepare_linked_requirement(req, parallel_builds)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 577, in _prepare_linked_requirement
                          dist = _get_prepared_distribution(
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 69, in _get_prepared_distribution
                          abstract_dist.prepare_distribution_metadata(
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/distributions/sdist.py", line 61, in prepare_distribution_metadata
                          self.req.prepare_metadata()
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/req/req_install.py", line 541, in prepare_metadata
                          self.metadata_directory = generate_metadata_legacy(
                          ^^^^^^^^^^^^^^^^^^^^^^^^^
                          File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/build/metadata_legacy.py", line 71, in generate_metadata
                          raise MetadataGenerationFailed(package_details=details) from error
                          pip._internal.exceptions.MetadataGenerationFailed: metadata generation failed
                          

                          🌍 Your Environment

                          Operating System:

                          
                          DISTRIB_ID=Ubuntu
                          DISTRIB_RELEASE=22.04
                          DISTRIB_CODENAME=jammy
                          DISTRIB_DESCRIPTION="Ubuntu 22.04.2 LTS"
                          

                          Output of bazel version:

                          
                          Bazelisk version: v1.14.0
                          Build label: 6.1.1
                          Build target: bazel-out/k8-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
                          Build time: Wed Mar 15 15:44:56 2023 (1678895096)
                          Build timestamp: 1678895096
                          Build timestamp as int: 1678895096
                          

                          Rules_python version:

                          
                          0.20.0
                          

                          Anything else relevant?

                          I'm also seeing this with another package, umi-tools, though there are some other 3.10->3.11 problems there I think so I felt docopt was a cleaner demonstration.

                          PS thank you so much for maintaining this project! Super amazing to have so much complexity hidden behind relatively simple rules.

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            Can Close?Will close in 30 days if there is no new activity

                            Type

                            No type

                            Projects

                            No projects

                              Milestone

                              No milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                              Skip to content

                              compile_pip_requirements + 3.11 failing on some packages #1140

                              Description

                              @aschleck

                              🐞 bug report

                              Affected Rule

                              The issue is caused by the rule: compile_pip_requirements

                              Is this a regression?

                              I don't think this is a regression in rules_python, but this works with Python 3.10 and does not work with 3.11.

                              Description

                              When I try to use compile_pip_requirements to recompile a lockfile with certain packages it cannot handle it. I would have thought the libraries were wrong, however a) pip install works in a non-Bazel venv and b) if I manually resolve the lockfile then pip_parse successfully can parse it and the dependencies work in my py_binary targets.

                              This seems similar-but-different to #914, but enable_implicit_namespace_pkgs does not seem to be an argument to compile_pip_requirements and anyway pip_parse has no problem parsing this package. Plus adding or removing --incompatible_default_to_explicit_init_py has no effect on this problem.

                              🔬 Minimal Reproduction

                              WORKSPACE:

                              load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
                              http_archive(
                              name = "rules_python",
                              sha256 = "a644da969b6824cc87f8fe7b18101a8a6c57da5db39caa6566ec6109f37d2141",
                              strip_prefix = "rules_python-0.20.0",
                              url = "https://github.com/bazelbuild/rules_python/releases/download/0.20.0/rules_python-0.20.0.tar.gz",
                              )
                              load("@rules_python//python:repositories.bzl", "py_repositories")
                              py_repositories()
                              load("@rules_python//python:repositories.bzl", "python_register_toolchains")
                              python_register_toolchains(
                              name = "python3_11",
                              python_version = "3.11",
                              )
                              load("@python3_11//:defs.bzl", "interpreter")
                              load("@rules_python//python:pip.bzl", "pip_parse")
                              pip_parse(
                              name = "python_deps",
                              python_interpreter_target = interpreter,
                              requirements_lock = "//:requirements_actual.txt",
                              )
                              load("@python_deps//:requirements.bzl", install_deps = "install_deps")
                              install_deps()
                              

                              BUILD:

                              load("@rules_python//python:pip.bzl", "compile_pip_requirements")
                              package(default_visibility = ["//visibility:public"])
                              compile_pip_requirements(
                              name = "requirements_lock",
                              extra_args = ["--allow-unsafe"],
                              )
                              

                              requirements_lock.in:

                              docopt==0.6.2
                              

                              Then run bazel run //:requirements_lock.update

                              If you create requirements_actual.txt with the same content as requirements_lock.in, then you can bazel build @python_deps_docopt//:pkg or use it as a dependency of a py_binary target succesfully.

                              🔥 Exception or Error

                              
                              Updating ./requirements_lock.txt
                              WARNING: the legacy dependency resolver is deprecated and will be removed in future versions of pip-tools. The default resolver will be changed to 'backtracking' in pip-tools 7.0.0. Specify --resolver=backtracking to silence this warning.
                              error: subprocess-exited-with-error
                              × python setup.py egg_info did not run successfully.
                              │ exit code: 1
                              ╰─> [6 lines of output]
                              Traceback (most recent call last):
                              File "", line 2, in File "", line 34, in File "/tmp/pip-resolver-fahvht28/docopt/setup.py", line 3, in from docopt import __version__
                              ModuleNotFoundError: No module named 'docopt'
                              [end of output]
                              note: This error originates from a subprocess, and is likely not a problem with pip.
                              Traceback (most recent call last):
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/build/metadata_legacy.py", line 64, in generate_metadata
                              call_subprocess(
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/utils/subprocess.py", line 224, in call_subprocess
                              raise error
                              pip._internal.exceptions.InstallationSubprocessError: python setup.py egg_info exited with 1
                              The above exception was the direct cause of the following exception:
                              Traceback (most recent call last):
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/rules_python/python/pip_install/tools/dependency_resolver/dependency_resolver.py", line 143, in cli()
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1137, in __call__
                              return self.main(*args, **kwargs)
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1062, in main
                              rv = self.invoke(ctx)
                              ^^^^^^^^^^^^^^^^
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 1404, in invoke
                              return ctx.invoke(self.callback, **ctx.params)
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/core.py", line 763, in invoke
                              return __callback(*args, **kwargs)
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__click/click/decorators.py", line 26, in new_func
                              return f(get_current_context(), *args, **kwargs)
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/scripts/compile.py", line 580, in cli
                              results = resolver.resolve(max_rounds=max_rounds)
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 253, in resolve
                              has_changed, best_matches = self._resolve_one_round()
                              ^^^^^^^^^^^^^^^^^^^^^^^^^
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 343, in _resolve_one_round
                              their_constraints.extend(self._iter_dependencies(best_match))
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/resolver.py", line 456, in _iter_dependencies
                              dependencies = self.repository.get_dependencies(ireq)
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/local.py", line 87, in get_dependencies
                              return self.repository.get_dependencies(ireq)
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/pypi.py", line 238, in get_dependencies
                              self._dependencies_cache[ireq] = self.resolve_reqs(
                              ^^^^^^^^^^^^^^^^^^
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip_tools/piptools/repositories/pypi.py", line 201, in resolve_reqs
                              results = resolver._resolve_one(reqset, ireq)
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/resolution/legacy/resolver.py", line 509, in _resolve_one
                              dist = self._get_dist_for(req_to_install)
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/resolution/legacy/resolver.py", line 462, in _get_dist_for
                              dist = self.preparer.prepare_linked_requirement(req)
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 491, in prepare_linked_requirement
                              return self._prepare_linked_requirement(req, parallel_builds)
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 577, in _prepare_linked_requirement
                              dist = _get_prepared_distribution(
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/prepare.py", line 69, in _get_prepared_distribution
                              abstract_dist.prepare_distribution_metadata(
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/distributions/sdist.py", line 61, in prepare_distribution_metadata
                              self.req.prepare_metadata()
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/req/req_install.py", line 541, in prepare_metadata
                              self.metadata_directory = generate_metadata_legacy(
                              ^^^^^^^^^^^^^^^^^^^^^^^^^
                              File "/home/april/.cache/bazel/_bazel_april/86326d1c1b8682421b2452cb9add301f/execroot/__main__/bazel-out/k8-fastbuild/bin/requirements_lock.update.runfiles/pypi__pip/pip/_internal/operations/build/metadata_legacy.py", line 71, in generate_metadata
                              raise MetadataGenerationFailed(package_details=details) from error
                              pip._internal.exceptions.MetadataGenerationFailed: metadata generation failed
                              

                              🌍 Your Environment

                              Operating System:

                              
                              DISTRIB_ID=Ubuntu
                              DISTRIB_RELEASE=22.04
                              DISTRIB_CODENAME=jammy
                              DISTRIB_DESCRIPTION="Ubuntu 22.04.2 LTS"
                              

                              Output of bazel version:

                              
                              Bazelisk version: v1.14.0
                              Build label: 6.1.1
                              Build target: bazel-out/k8-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
                              Build time: Wed Mar 15 15:44:56 2023 (1678895096)
                              Build timestamp: 1678895096
                              Build timestamp as int: 1678895096
                              

                              Rules_python version:

                              
                              0.20.0
                              

                              Anything else relevant?

                              I'm also seeing this with another package, umi-tools, though there are some other 3.10->3.11 problems there I think so I felt docopt was a cleaner demonstration.

                              PS thank you so much for maintaining this project! Super amazing to have so much complexity hidden behind relatively simple rules.

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                Can Close?Will close in 30 days if there is no new activity

                                Type

                                No type

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions