{"record":{"id":"73a86b294f2dcf34","repo":"apache/seatunnel","slug":"server-property-does-not-contain-a-usable-absol","errorCode":null,"errorMessage":"Server property {} does not contain a usable absolute path","messagePattern":"Server property (.+?) does not contain a usable absolute path","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-python/src/main/java/org/apache/seatunnel/connectors/seatunnel/python/source/PythonSourceExecutionPolicy.java","lineNumber":95,"sourceCode":"                    \"Server property \"\n                            + PYTHON_ALLOWED_EXECUTABLES_PROPERTY\n                            + \" must contain at least one absolute executable path\");\n        }\n        Set<Path> allowedExecutables = new LinkedHashSet<>();\n        for (String rawEntry : rawAllowlist.split(\",\")) {\n            String entry = rawEntry.trim();\n            if (entry.isEmpty()) {\n                continue;\n            }\n            Path path = Paths.get(entry);\n            if (!path.isAbsolute()) {\n                throw new IllegalStateException(\n                        \"Python source allowlist entry must be an absolute path: \" + entry);\n            }\n            allowedExecutables.add(normalize(path));\n        }\n        if (allowedExecutables.isEmpty()) {\n            throw new IllegalStateException(\n                    \"Server property \"\n                            + PYTHON_ALLOWED_EXECUTABLES_PROPERTY\n                            + \" does not contain a usable absolute path\");\n        }\n        return new ArrayList<>(allowedExecutables);\n    }\n\n    private static Path resolveConfiguredExecutable(String configuredExecutable)\n            throws IOException {\n        Path configuredPath = Paths.get(configuredExecutable);\n        Path resolvedPath;\n        if (configuredPath.isAbsolute()) {\n            resolvedPath = normalize(configuredPath);\n        } else if (configuredPath.getParent() == null) {\n            resolvedPath = resolveCommandFromPath(configuredExecutable);\n            if (resolvedPath == null) {\n                throw new IOException(\n                        \"Unable to resolve python.executable from PATH: \" + configuredExecutable);","sourceCodeStart":77,"sourceCodeEnd":113,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-python/src/main/java/org/apache/seatunnel/connectors/seatunnel/python/source/PythonSourceExecutionPolicy.java#L77-L113","documentation":"Thrown after parsing the python.allowed.executables property when, despite non-empty raw input, no usable absolute path survived (e.g. the value contained only commas or whitespace between separators). The parsed allowlist set came out empty, so the policy refuses to continue.","triggerScenarios":"Setting the property to values like ' , , ' or ',,': rawAllowlist.trim() is non-empty so the blank check passes, but every split entry is skipped as empty and allowedExecutables stays empty.","commonSituations":"A config templating tool rendering the value to only separators; a placeholder like ${PYTHON_PATH} substituting to ',' or spaces; manual editing that left only commas.","solutions":["Set the property to at least one real absolute path, e.g. /usr/bin/python3","Print the effective value and inspect for stray separators: echo \"$JAVA_OPTS\"","Fix the templating/CI variable that should supply the path"],"exampleFix":"// before\n-Dpython.allowed.executables=,,\n// after\n-Dpython.allowed.executables=/usr/bin/python3","handlingStrategy":"validation","validationCode":"String v = System.getProperty(\"python.allowed.executables\", \"\");\nboolean any = java.util.Arrays.stream(v.split(\",\")).map(String::trim).anyMatch(s -> !s.isEmpty() && java.nio.file.Paths.get(s).isAbsolute());\nif (!any) throw new IllegalStateException(\"Allowlist has no usable absolute path\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Avoid templated values that can render as only separators","Fail fast in CI when the property expands to an empty list","Quote defaults in config generators"],"tags":["python","configuration","security","validation"],"backgroundTag":"empty-required-field","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}