fix: Fix bazel vendor support for requirements with environment markers (#2997)

Fixes `bazel vendor` support for requirements files that contain
environment markers. During a vendored `bazel build`, when
evaluate_markers_py() is run it needs PYTHONHOME set to properly find
the home of the vendored libraries.

Resolves #2996

---------

Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com>
diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml
index 01af217..07ffa4e 100644
--- a/.bazelci/presubmit.yml
+++ b/.bazelci/presubmit.yml
@@ -272,6 +272,15 @@
     working_directory: examples/bzlmod
     platform: debian11
     bazel: 7.x
+  integration_test_bzlmod_ubuntu_vendor:
+    <<: *reusable_build_test_all
+    name: "examples/bzlmod: bazel vendor"
+    working_directory: examples/bzlmod
+    platform: ubuntu2004
+    shell_commands:
+    - "bazel vendor --vendor_dir=./vendor //..."
+    - "bazel build --vendor_dir=./vendor //..."
+    - "rm -rf ./vendor"
   integration_test_bzlmod_macos:
     <<: *reusable_build_test_all
     <<: *coverage_targets_example_bzlmod
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ecdc129..4facff4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -61,7 +61,9 @@
 
 {#v0-0-0-fixed}
 ### Fixed
-* Nothing fixed.
+* (pypi) Fixes an issue where builds using a `bazel vendor` vendor directory
+  would fail if the constraints file contained environment markers. Fixes
+  [#2996](https://github.com/bazel-contrib/rules_python/issues/2996).
 
 {#v0-0-0-added}
 ### Added
diff --git a/examples/bzlmod/.bazelignore b/examples/bzlmod/.bazelignore
index 3927f8e..536ded9 100644
--- a/examples/bzlmod/.bazelignore
+++ b/examples/bzlmod/.bazelignore
@@ -1,2 +1,3 @@
 other_module
 py_proto_library/foo_external
+vendor
diff --git a/examples/bzlmod/.gitignore b/examples/bzlmod/.gitignore
index ac51a05..0f6c631 100644
--- a/examples/bzlmod/.gitignore
+++ b/examples/bzlmod/.gitignore
@@ -1 +1,2 @@
 bazel-*
+vendor/
diff --git a/python/private/pypi/evaluate_markers.bzl b/python/private/pypi/evaluate_markers.bzl
index 58a29a9..2b805c3 100644
--- a/python/private/pypi/evaluate_markers.bzl
+++ b/python/private/pypi/evaluate_markers.bzl
@@ -78,14 +78,16 @@
     out_file = mrctx.path("requirements_with_markers.out.json")
     mrctx.file(in_file, json.encode(requirements))
 
+    interpreter = pypi_repo_utils.resolve_python_interpreter(
+        mrctx,
+        python_interpreter = python_interpreter,
+        python_interpreter_target = python_interpreter_target,
+    )
+
     pypi_repo_utils.execute_checked(
         mrctx,
         op = "ResolveRequirementEnvMarkers({})".format(in_file),
-        python = pypi_repo_utils.resolve_python_interpreter(
-            mrctx,
-            python_interpreter = python_interpreter,
-            python_interpreter_target = python_interpreter_target,
-        ),
+        python = interpreter,
         arguments = [
             "-m",
             "python.private.pypi.requirements_parser.resolve_target_platforms",
@@ -94,6 +96,7 @@
         ],
         srcs = srcs,
         environment = {
+            "PYTHONHOME": str(interpreter.dirname),
             "PYTHONPATH": [
                 Label("@pypi__packaging//:BUILD.bazel"),
                 Label("//:BUILD.bazel"),