google-cloud-compute fails to import on Python 3.14 — protobuf<5 pins incompatible protobuf 4.x (TypeError: Metaclasses with custom tp_new are not supported)
type: bugtriage me
### Determine this is the right repository
- [x] I determined this is the correct repository in which to report this bug.
### Summary of the issue
**Context**
I upgraded our project to Python 3.14 (CPython 3.14.7, via mise/uv). google-cloud-compute is a direct dependency (currently ==1.15.0). Its metadata declares `protobuf>=3.19.5,<5.0.0dev`, so the resolver installs the newest allowed protobuf on the 4.x line.
**Expected Behavior:**
`import google.cloud.compute` works on Python 3.14, the same way it works on 3.11–3.13.
**Actual Behavior:**
Importing the package (or any package that pulls in protobuf, e.g. temporalio) immediately raises `TypeError: Metaclasses with custom tp_new are not supported.` on Python 3.14. protobuf 4.x ships a C extension whose metaclass uses a custom `tp_new`, which CPython 3.14 now rejects. The `protobuf<5` upper bound blocks the only line (protobuf 6.x) whose C extension is fixed for 3.14.
### API client name and version
google-cloud-compute==1.15.0
### Reproduction steps: code
file: main.py
```python
import google.cloud.compute # raises TypeError on Python 3.14
print("ok")
### Reproduction steps: supporting files
No extra data files are required. The only relevant constraint is the version pin resolved from the dependency:
file: requirements.txt (minimal)
google-cloud-compute==1.15.0
### Reproduction steps: actual results
$ python3 -c "import google.cloud.compute"
Traceback (most recent call last):
File "<string>", line 1, in <module>
File ".../site-packages/google/cloud/compute/__init__.py", line 18, in <module>
...
File ".../site-packages/google/protobuf/internal/api_implementation.py", line 51, in <module>
if _CanImport('google._upb._message'):
File ".../site-packages/google/protobuf/internal/api_implementation.py", line 41, in _CanImport
mod = importlib.import_module(mod_name)
File ".../lib/python3.14/importlib/__init__.py", line 88, in import_module
return _bootstrap._gcd_import(name, level)
TypeError: Metaclasses with custom tp_new are not supported.
Setting PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python does NOT help: protobuf probes
google._upb._message first and the probe itself raises TypeError (not ImportError), so the
pure-Python fallback never engages.
### Reproduction steps: expected results
$ python3 -c "import google.cloud.compute"
ok
### OS & version + platform
macOS 27 (Golden Gate), Apple Silicon (arm64)
### Python environment
Python 3.14.7
### Python dependencies
pip list | grep -iE "protobuf|google-cloud-compute|google-api-core|proto-plus"
google-api-core 2.27.0
google-cloud-compute 1.15.0
proto-plus 1.26.1
protobuf 4.25.9 # forced by google-cloud-compute <5.0.0dev
### Additional context
Root cause
google-cloud-compute pins `protobuf>=3.19.5,<5.0.0dev`. On Python 3.14:
- protobuf 4.25.9 (highest allowed) -> C extension fails with
`TypeError: Metaclasses with custom tp_new are not supported.`
(CPython 3.14 forbids custom-tp_new metaclasses).
- protobuf 6.x (C extension fixed for 3.14) -> blocked by the <5 upper bound.
This is a hard deadlock for anyone running google-cloud-compute on Python 3.14.
Evidence that 6.x works at runtime
We forced protobuf 6.33.6 (uv `override-dependencies = ["protobuf>=6.31.0,<7"]`)
and verified on Python 3.14.7:
- import google.cloud.compute -> OK
- import temporalio (also protobuf-dependent) -> OK
- protobuf message serialization round-trips -> OK
- temporalio generated *_pb2 round-trips -> OK
So the <5 upper bound is overly conservative; the client runs fine on protobuf 6.x.
Suggested fix
Loosen the protobuf upper bound in google-cloud-compute, e.g. to <8.0.0
(consistent with the other google-cloud-* clients) or at least <7.0.0, and add a
Python 3.14 CI job so this regression is caught earlier.
Workaround (for affected users)
- With uv: override-dependencies = ["protobuf>=6.31.0,<7"] in [tool.uv].
- With pip: pip install --no-deps "google-cloud-compute==1.15.0" "protobuf>=6.31.0"
then resolve the rest normally.
Related: temporalio already allows protobuf>=3.20,<8.0.0, confirming 6.x is the intended target line.
0 条评论