mirror of
https://github.com/microsoft/agent-framework.git
synced 2026-06-16 21:04:09 +08:00
Run func worker natively on Python 3.13 by disabling dependency isolation
Replace the Python 3.12 redirect workaround with the proper fix: set PYTHON_ISOLATE_WORKER_DEPENDENCIES=0 on Python >=3.13. The segfault (exit code 139) is caused by the Azure Functions worker's module isolation mechanism conflicting with protobuf's C extensions (google._upb) on Python 3.13. Disabling isolation lets the worker load dependencies from the app's own environment, which avoids the crash while keeping everything running on Python 3.13. See: https://github.com/Azure/azure-functions-python-worker/issues/1797 Co-authored-by: larohra <41490930+larohra@users.noreply.github.com>
This commit is contained in:
@@ -350,35 +350,6 @@ def _load_and_validate_env() -> None:
|
||||
)
|
||||
|
||||
|
||||
def _find_func_worker_python() -> str | None:
|
||||
"""Find a Python 3.10-3.12 executable for the Azure Functions worker.
|
||||
|
||||
The Azure Functions Core Tools worker may segfault on Python >=3.13 due to
|
||||
protobuf/grpcio C extension compatibility issues (``google._upb`` crash).
|
||||
This returns a path to a compatible Python interpreter so the function host
|
||||
can use it instead of the default (which is the test runner's Python).
|
||||
|
||||
Returns ``None`` when the current interpreter is already compatible or no
|
||||
alternative can be found.
|
||||
"""
|
||||
if sys.version_info < (3, 13):
|
||||
return None # Current Python is compatible; no override needed.
|
||||
|
||||
# Check for an explicit override first (e.g. set by CI).
|
||||
explicit = os.environ.get("FUNC_WORKER_PYTHON", "").strip()
|
||||
if explicit and Path(explicit).is_file():
|
||||
return explicit
|
||||
|
||||
# Try versioned system executables (python3.12, python3.11, python3.10).
|
||||
# Azure Functions v4 supports Python 3.10–3.12.
|
||||
for minor in range(12, 9, -1):
|
||||
path = shutil.which(f"python3.{minor}")
|
||||
if path:
|
||||
return path
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def _start_function_app(sample_path: Path, port: int) -> subprocess.Popen[Any]:
|
||||
"""Start a function app in the specified sample directory.
|
||||
|
||||
@@ -390,15 +361,13 @@ def _start_function_app(sample_path: Path, port: int) -> subprocess.Popen[Any]:
|
||||
# use the task hub name to separate orchestration state.
|
||||
env["TASKHUB_NAME"] = f"test{uuid.uuid4().hex[:8]}"
|
||||
|
||||
# The Azure Functions Python worker may crash on Python >=3.13 with a
|
||||
# SIGSEGV in the protobuf C extension (google._upb). Point the worker at
|
||||
# a compatible Python when one is available.
|
||||
worker_python = _find_func_worker_python()
|
||||
if worker_python:
|
||||
# Azure Functions uses double-underscore separators for nested config
|
||||
# keys passed as environment variables (host.json equivalent:
|
||||
# languageWorkers.python.defaultExecutablePath).
|
||||
env["languageWorkers__python__defaultExecutablePath"] = worker_python
|
||||
# The Azure Functions Python worker's dependency isolation mechanism crashes
|
||||
# on Python 3.13 with a SIGSEGV in the protobuf C extension (google._upb).
|
||||
# Disabling isolation lets the worker load dependencies from the app's own
|
||||
# environment, which avoids the crash.
|
||||
# See: https://github.com/Azure/azure-functions-python-worker/issues/1797
|
||||
if sys.version_info >= (3, 13):
|
||||
env.setdefault("PYTHON_ISOLATE_WORKER_DEPENDENCIES", "0")
|
||||
|
||||
# On Windows, use CREATE_NEW_PROCESS_GROUP to allow proper termination
|
||||
# shell=True only on Windows to handle PATH resolution
|
||||
|
||||
Reference in New Issue
Block a user