protocolbuffers / protocolbuffers/protobuf

py_proto_library rule not using prebuilt protoc

Open
#28,028 3 comments 1 reaction 1 assignee View on GitHub

@anandolee is already working on this.

Since Jun 16, 2026.

bazel bug python
Dominant language
C++
Stars
72k
Forks
16.3k
Avg merge
1d 17h
Merged PRs (30d)
140

Description

What version of protobuf and what language are you using?
Version: 35.1
Language: Python

What supported operating system version are you using (e.g. Linux, Windows) ?
macOS 26.5.1

What supported runtime / compiler version are you using (e.g. python version, gcc version)
Bazel 9.1.0
rules_python 2.0.0
Python 3.13 toolchain from rules_python

What did you do?

I have what I think is a pretty vanilla Bazel/Python/Protobuf configuration, and I'm trying to use the recently-released support for prebuilt protobuf compiler binaries. It's not working - trying to build a py_proto_library rule results in the protobuf compiler being built from source.

To debug, I ran bazel cquery 'somepath("//my_project/proto:my_py_proto", "@protobuf//src/google/protobuf")' which gave me the following dependency chain:

//my_project/proto:my_py_proto
@protobuf//python:python_toolchain
@protobuf//python:protobuf_python
@protobuf//python:python_srcs
@protobuf//python:python_src_files
@protobuf//python:google/protobuf/internal/python_edition_defaults.py
@protobuf//python:embedded_python_edition_defaults_generate
@protobuf//editions:internal_defaults_escape
@protobuf//src/google/protobuf:protobuf

My uneducated guess at narrowing down the problem is that @protobuf//python:python_toolchain is mis-resolving such that it depends on @protobuf//python:protobuf_python, which in turn depends on python_edition_defaults.py, in turn generated from C++ stuff. I would expect the dependency chain to stop after python_toolchain. To the extent that Python sources are needed to compile my protos, I'd expect them to be part of the prebuilt compiler distribution, and to the extent they're needed at runtime I'd expect to get them from PyPI. But my convictions aren't very strong here, maybe I'm doing something obviously wrong?

For good measure I also tried

bazel build //my_project/proto:my_py_proto \
  --'@protobuf//bazel/flags:prefer_prebuilt_protoc' \
  --incompatible_enable_proto_toolchain_resolution

with the same result.

What did you expect to see

Prebuilt compiler used, compiler not built from source

What did you see instead?

Compiler built from source

Anything else we should know about your project / environment

I have some gross workarounds in my BUILD files to relocate the proto Python modules going into the wheel I'm trying to build, but all of that is downstream of the py_proto_library rule and I wouldn't expect it to affect the proto library's upstream dependencies.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.