Conversation
There was a problem hiding this comment.
Pull request overview
This PR adds support for a new Python environment provider node with a Pixi port object, integrating it into the Python scripting nodes ecosystem. The changes enable Python script nodes to receive Python environments through an optional input port instead of only relying on configured preferences.
Changes:
- Introduced
PythonProcessProvideras a replacement interface for the deprecatedPythonCommandto support multiple environment sources - Added optional Python environment port support to Python Script and Python View nodes
- Implemented environment port extraction and installation logic with progress reporting
Reviewed changes
Copilot reviewed 41 out of 41 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| org.knime.python3/src/main/java/org/knime/python3/PythonCommand.java | Deprecated PythonCommand interface, now extends PythonProcessProvider for backward compatibility |
| org.knime.python3/src/main/java/org/knime/python3/SimplePythonCommand.java | Updated documentation to reference PythonProcessProvider |
| org.knime.python3/src/main/java/org/knime/python3/QueuedPythonGatewayFactory.java | Refactored to use PythonProcessProvider instead of PythonCommand |
| org.knime.python3/src/main/java/org/knime/python3/PythonGatewayFactory.java | Updated gateway description to work with PythonProcessProvider |
| org.knime.python3.scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/script/PythonScriptNodeFactory.java | Added optional Python environment port to Python Script node |
| org.knime.python3.scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/view/PythonViewNodeFactory.java | Added optional Python environment port to Python View node |
| org.knime.python3.scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptNodeModel.java | Implemented environment port extraction and prioritization over configured Python command |
| org.knime.python3.scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingService.java | Added environment port handling for interactive sessions |
| org.knime.python3.scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingSession.java | Added PythonCommandAdapter to bridge PythonProcessProvider to legacy PythonCommand |
| org.knime.python3.scripting.nodes/src/main/java/org/knime/python3/scripting/nodes/PortsConfigurationUtils.java | Added utility methods for environment port detection and installation |
| org.knime.python3.scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonIOUtils.java | Updated to filter out environment ports from data processing |
| org.knime.python3.scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingInputOutputModelUtils.java | Added logic to skip environment ports in input/output model generation |
...pting.nodes/src/main/java/org/knime/python3/scripting/nodes2/view/PythonViewNodeFactory.java
Outdated
Show resolved
Hide resolved
...g.nodes/src/main/java/org/knime/python3/scripting/nodes2/script/PythonScriptNodeFactory.java
Outdated
Show resolved
Hide resolved
...ipting.nodes/src/main/java/org/knime/python3/scripting/nodes/view/PythonViewNodeFactory.java
Outdated
Show resolved
Hide resolved
...ng.nodes/src/main/java/org/knime/python3/scripting/nodes/script/PythonScriptNodeFactory.java
Outdated
Show resolved
Hide resolved
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingService.java
Outdated
Show resolved
Hide resolved
...g.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptPortsConfiguration.java
Outdated
Show resolved
Hide resolved
...g.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptPortsConfiguration.java
Outdated
Show resolved
Hide resolved
org.knime.python3/src/main/java/org/knime/python3/PythonCommand.java
Outdated
Show resolved
Hide resolved
....nodes/src/main/java/org/knime/python3/scripting/nodes/AbstractPythonScriptingNodeModel.java
Outdated
Show resolved
Hide resolved
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes/PortsConfigurationUtils.java
Outdated
Show resolved
Hide resolved
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes/PortsConfigurationUtils.java
Outdated
Show resolved
Hide resolved
...s/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingInputOutputModelUtils.java
Outdated
Show resolved
Hide resolved
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingService.java
Outdated
Show resolved
Hide resolved
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingService.java
Outdated
Show resolved
Hide resolved
....scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptNodeModel.java
Outdated
Show resolved
Hide resolved
...g.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptPortsConfiguration.java
Show resolved
Hide resolved
...g.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptPortsConfiguration.java
Outdated
Show resolved
Hide resolved
...g.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptPortsConfiguration.java
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 41 out of 41 changed files in this pull request and generated 3 comments.
Comments suppressed due to low confidence (2)
org.knime.python3.scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/script/PythonScriptNodeFactory.java:1
- The variable
pythonEnvClassis declared but never used on line 130 and 139. This appears to be a leftover from development and should be removed to reduce code clutter.
/*
org.knime.python3.scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/view/PythonViewNodeFactory.java:1
- The variable
pythonEnvClassis declared on line 91 in the view factory but never used. This appears to be a leftover from development and should be removed to reduce code clutter.
/*
...pting.nodes/src/main/java/org/knime/python3/scripting/nodes2/view/PythonViewNodeFactory.java
Outdated
Show resolved
Hide resolved
...g.nodes/src/main/java/org/knime/python3/scripting/nodes2/script/PythonScriptNodeFactory.java
Outdated
Show resolved
Hide resolved
...nodes/src/main/java/org/knime/python3/scripting/nodes/prefs/Python3ScriptingPreferences.java
Outdated
Show resolved
Hide resolved
5297ab6 to
a396f21
Compare
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingSession.java
Outdated
Show resolved
Hide resolved
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingSession.java
Outdated
Show resolved
Hide resolved
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingSession.java
Outdated
Show resolved
Hide resolved
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingSession.java
Outdated
Show resolved
Hide resolved
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingSession.java
Outdated
Show resolved
Hide resolved
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingService.java
Outdated
Show resolved
Hide resolved
org.knime.python3/src/main/java/org/knime/python3/PythonGatewayFactory.java
Outdated
Show resolved
Hide resolved
....nodes/src/main/java/org/knime/python3/scripting/nodes/AbstractPythonScriptingNodeModel.java
Outdated
Show resolved
Hide resolved
....nodes/src/main/java/org/knime/python3/scripting/nodes/AbstractPythonScriptingNodeModel.java
Outdated
Show resolved
Hide resolved
|
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingSession.java
Outdated
Show resolved
Hide resolved
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingSession.java
Outdated
Show resolved
Hide resolved
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingSession.java
Outdated
Show resolved
Hide resolved
...nodes/src/main/java/org/knime/python3/scripting/nodes/prefs/Python3ScriptingPreferences.java
Outdated
Show resolved
Hide resolved
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingService.java
Outdated
Show resolved
Hide resolved
....python3.scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonIOUtils.java
Outdated
Show resolved
Hide resolved
...g.nodes/src/main/java/org/knime/python3/scripting/nodes2/script/PythonScriptNodeFactory.java
Outdated
Show resolved
Hide resolved
....nodes/src/main/java/org/knime/python3/scripting/nodes/AbstractPythonScriptingNodeModel.java
Outdated
Show resolved
Hide resolved
732d9ac to
15d85da
Compare
15d85da to
3e4affb
Compare
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes/PortsConfigurationUtils.java
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
This utility method hard-links to PythonEnvironmentPortObject in its signature and body even though org.knime.pixi.port is declared optional. In OSGi, such direct type references can still trigger NoClassDefFoundError at class load/link time (not just at execution), which would prevent the scripting nodes bundle from loading when the optional bundle isn’t available. To keep the dependency truly optional, avoid exposing Pixi types in public method signatures and isolate direct references behind reflection or a separate fragment/bundle that is only resolved when org.knime.pixi.port is present.
....scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptNodeModel.java
Outdated
Show resolved
Hide resolved
68c0942 to
d461935
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 41 out of 41 changed files in this pull request and generated 7 comments.
Comments suppressed due to low confidence (1)
org.knime.python3.scripting.nodes/src/main/java/org/knime/python3/scripting/nodes/PortsConfigurationUtils.java:1
filterEnvironmentPort(...)assumes there is exactly one environment port and allocatesinObjects.length - 1. If the config ever contains 0 (unexpected state), or more than 1 environment port (future extensibility), this produces an incorrectly sized array (either missing entries or leaving trailing nulls). A more robust approach is to compute the exact number of non-environment ports first (similar tocreateInputPorts) and allocate based on that count, or build a list and convert to array.
/*
org.knime.python3/src/main/java/org/knime/python3/PythonCommand.java
Outdated
Show resolved
Hide resolved
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingService.java
Outdated
Show resolved
Hide resolved
org.knime.python3/src/main/java/org/knime/python3/SimplePythonCommand.java
Show resolved
Hide resolved
...s/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingInputOutputModelUtils.java
Outdated
Show resolved
Hide resolved
...s/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingInputOutputModelUtils.java
Outdated
Show resolved
Hide resolved
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingSession.java
Outdated
Show resolved
Hide resolved
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingSession.java
Outdated
Show resolved
Hide resolved
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes/PortsConfigurationUtils.java
Outdated
Show resolved
Hide resolved
...g.nodes/src/main/java/org/knime/python3/scripting/nodes2/script/PythonScriptNodeFactory.java
Outdated
Show resolved
Hide resolved
...s/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingInputOutputModelUtils.java
Outdated
Show resolved
Hide resolved
....scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptNodeModel.java
Show resolved
Hide resolved
....python3.scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonIOUtils.java
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 36 out of 36 changed files in this pull request and generated 4 comments.
Comments suppressed due to low confidence (1)
org.knime.python3.scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingSession.java:1
- The
extractPythonEnvironmentPortmethod is called twice in this code block (lines 262 and 266). Store the result in a variable to avoid redundant traversal of the input array.
/*
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingService.java
Outdated
Show resolved
Hide resolved
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingService.java
Outdated
Show resolved
Hide resolved
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes/PortsConfigurationUtils.java
Outdated
Show resolved
Hide resolved
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes/PortsConfigurationUtils.java
Outdated
Show resolved
Hide resolved
AP-25245 (Python Environment Provider (Preview - Hidden))
AP-25245 (Python Environment Provider (Preview - Hidden))
....scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptNodeModel.java
Outdated
Show resolved
Hide resolved
AP-25245 (Python Environment Provider (Preview - Hidden))
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes/PortsConfigurationUtils.java
Outdated
Show resolved
Hide resolved
...nodes/src/main/java/org/knime/python3/scripting/nodes/prefs/Python3ScriptingPreferences.java
Show resolved
Hide resolved
AP-25245 (Python Environment Provider (Preview - Hidden))
AP-25245 (Python Environment Provider (Preview - Hidden))
AP-25245 (Python Environment Provider (Preview - Hidden))
…entPort AP-25245 (Python Environment Provider (Preview - Hidden))
AP-25245 (Python Environment Provider (Preview - Hidden))
AP-25245 (Python Environment Provider (Preview - Hidden))
AP-25245 (Python Environment Provider (Preview - Hidden))
AP-25245 (Python Environment Provider (Preview - Hidden))
....scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptNodeModel.java
Show resolved
Hide resolved
org.knime.python3/src/main/java/org/knime/python3/SimplePythonCommand.java
Show resolved
Hide resolved
...scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptingService.java
Outdated
Show resolved
Hide resolved
....scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonScriptNodeModel.java
Outdated
Show resolved
Hide resolved
....python3.scripting.nodes/src/main/java/org/knime/python3/scripting/nodes2/PythonIOUtils.java
Show resolved
Hide resolved
org.knime.python3/src/main/java/org/knime/python3/QueuedPythonGatewayFactory.java
Show resolved
Hide resolved
org.knime.python3/src/main/java/org/knime/python3/AbstractPythonCommand.java
Show resolved
Hide resolved
org.knime.python3/src/main/java/org/knime/python3/AbstractPythonCommand.java
Show resolved
Hide resolved
| import org.knime.conda.CondaEnvironmentDirectory; | ||
| import org.knime.externalprocessprovider.ExternalProcessProvider; | ||
|
|
||
| /** | ||
| * Conda-specific implementation of {@link PythonCommand} that works with bundled Python environments. Allows to build | ||
| * Conda-specific implementation of {@link ExternalProcessProvider} that works with bundled Python environments. Allows to build | ||
| * Python processes for a given Conda environment. Takes care of resolving PATH-related issues on Windows. |
There was a problem hiding this comment.
ExternalProcessProvider is imported but only referenced from Javadoc, so the import is unused and may break strict builds. Remove the import or use the fully-qualified name in the Javadoc link.
| } else if (PickledObjectFileStorePortObject.TYPE.equals(portType)) { | ||
| numInObjects++; | ||
| } else if (isPythonEnvironmentPort(portType)) { | ||
| hasEnvironmentPort = true; |
There was a problem hiding this comment.
fromCurrentNodeContext() sets hasEnvironmentPort to true based solely on the configured port type (including TYPE_OPTIONAL). For an optional but unconnected environment port this will still be true, but there will be no PythonEnvironmentPortObject instance in PortObject[], causing extractPythonEnvironmentPort(...) callers to fail at runtime.
| hasEnvironmentPort = true; | |
| if (nodeContainer.getInPort(i).getPortObject() instanceof PythonEnvironmentPortObject) { | |
| hasEnvironmentPort = true; | |
| } |
| public static PythonEnvironmentPortObject extractPythonEnvironmentPort(final PortObject[] inObjects) { | ||
| for (final PortObject inObject : inObjects) { | ||
| if (inObject instanceof PythonEnvironmentPortObject envPort) { | ||
| return envPort; | ||
| } | ||
| } | ||
| throw new IllegalArgumentException( | ||
| "Expected a Python environment port object in the input ports, but none was found."); | ||
| } |
There was a problem hiding this comment.
extractPythonEnvironmentPort(...) throws IllegalArgumentException if the env port object is absent. Since the env port group is configured as optional, callers should be able to proceed when it is not connected; consider returning Optional<PythonEnvironmentPortObject> (or a nullable value) and letting callers fall back to the configured executable selection.
| import org.knime.externalprocessprovider.ExternalProcessProvider; | ||
|
|
||
| /** | ||
| * A simple implementation of {@link PythonCommand}. Runs a command that is given by a list of strings. | ||
| * A simple implementation of {@link ExternalProcessProvider}. Runs a command that is given by a list of strings. |
There was a problem hiding this comment.
ExternalProcessProvider is only referenced in the Javadoc here, so this import is unused and may fail the build under strict compiler settings. Remove the import or reference the type with its fully-qualified name in the Javadoc.
| import org.knime.conda.CondaEnvironmentDirectory; | ||
| import org.knime.externalprocessprovider.ExternalProcessProvider; | ||
|
|
||
| /** | ||
| * Conda-specific implementation of {@link PythonCommand}. Allows to build Python processes for a given Conda | ||
| * Conda-specific implementation of {@link ExternalProcessProvider}. Allows to build Python processes for a given Conda | ||
| * installation and environment. Takes care of resolving PATH-related issues on Windows. |
There was a problem hiding this comment.
ExternalProcessProvider is imported but not used in code (only in Javadoc), which can trigger unused-import errors/warnings in the Eclipse/Tycho build. Remove the import or use a fully-qualified type reference in the Javadoc.
AP-25245 (Python Environment Provider (Preview - Hidden))


Add support for the new python environment provider node and it's pixi port object to the python scripts