From 5532dffec21b67cb510d480da08a050e9d765573 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Feb 2026 19:52:06 +0000 Subject: [PATCH] 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> --- .../action.yml | 19 -------- .../tests/integration_tests/conftest.py | 45 +++---------------- 2 files changed, 7 insertions(+), 57 deletions(-) diff --git a/.github/actions/azure-functions-integration-setup/action.yml b/.github/actions/azure-functions-integration-setup/action.yml index f0de0f6797..28c1c6cd1d 100644 --- a/.github/actions/azure-functions-integration-setup/action.yml +++ b/.github/actions/azure-functions-integration-setup/action.yml @@ -46,22 +46,3 @@ runs: echo "Installing Azure Functions Core Tools" npm install -g azure-functions-core-tools@4 --unsafe-perm true func --version - - name: Ensure Python 3.12 is available for Azure Functions worker - shell: bash - run: | - # The Azure Functions Python worker may segfault on Python >=3.13 - # (protobuf C extension crash). Ensure a compatible Python is - # available so the conftest can redirect the worker to it. - if ! python3.12 --version 2>/dev/null; then - echo "Python 3.12 not found on system, installing via uv..." - uv python install 3.12 - FUNC_WORKER_PYTHON="$(uv python find 3.12)" - if [ -n "${FUNC_WORKER_PYTHON}" ] && [ -f "${FUNC_WORKER_PYTHON}" ]; then - echo "FUNC_WORKER_PYTHON=${FUNC_WORKER_PYTHON}" >> "$GITHUB_ENV" - echo "Installed Python 3.12 at ${FUNC_WORKER_PYTHON}" - else - echo "::warning::Could not resolve Python 3.12 path after install" - fi - else - echo "System Python 3.12 found: $(which python3.12)" - fi diff --git a/python/packages/azurefunctions/tests/integration_tests/conftest.py b/python/packages/azurefunctions/tests/integration_tests/conftest.py index 7045ce4930..907ad039ca 100644 --- a/python/packages/azurefunctions/tests/integration_tests/conftest.py +++ b/python/packages/azurefunctions/tests/integration_tests/conftest.py @@ -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