Calling napari from KNIME

Hi,

I have a script (pasted below) to display images in napari. The script uses path information provided by KNIME and I select labels based on some logic in KNIME (thresholds, ML classification, etc.) to display in napari the images the masks of the objects and the selected objects. The code executes perfectly until a napari veier is called. I can call a viewer from the environment so the installation is correct. Any idea what might go wrong?

Thanks

Here is the script:

import knime.scripting.io as knio

Copy input to output

import napari

from tifffile import imread

from skimage import transform, imgasfloat, imgasuint

import numpy as np

inputtable1 = knio.inputtables[0].topandas()

inputtable2 = knio.inputtables[1].topandas()

imagepaths = sorted(inputtable_1[‘Path’])

#nucleilabelpaths = sorted(inputtable1[‘NucleiSeg’])

#organoidslabelpaths = sorted(inputtable1[‘OrganoidSeg’])

img405 = np.asarray([imread(img) for img in imagepaths if r’Z01C01.tif’ in img])

img488 = np.asarray([imread(img) for img in imagepaths if r’Z01C02.tif’ in img])

img564 = np.asarray([imread(img) for img in imagepaths if r’Z01C03.tif’ in img])

labelnuclei = np.asarray([imread(img) for img in imagepaths if ‘nuclei_Seg.tif’ in img]).astype(int)

labelorganoids = np.asarray([imread(img) for img in imagepaths if ‘organoid_Seg.tif’ in img]).astype(int)

grouped = inputtable2.groupby(‘site’)

livenucleilabels = np.zeros(label_nuclei.shape)

for name, group in grouped:

field = int(name[1:])-1

a= np.array(group[‘label’].values).astype(int)

#print(group[‘label’])

mask = np.isin(label_nuclei[field], a)

livenucleilabels[field] = label_nuclei[field]*mask

#print(group[‘label’].values)

labelnuclei[labelnuclei>0] = 1

viewer = napari.Viewer()

viewer.add_image(

img_405,

#contrast_limits=[200, 5200],

name=‘Nuclei’,

colormap=‘gray’,

blending=‘additive’

)

viewer.add_image(

img_488,

#contrast_limits=[200, 5200],

name=‘Yap Ab’,

colormap=‘green’,

blending=‘additive’

)

viewer.add_image(

img_564,

#contrast_limits=[200, 5200],

name=‘mCherry’,

colormap=‘red’,

blending=‘additive’

)

viewer.add_labels(

label_nuclei,

name=‘nuclei_labels’,

blending=‘additive’,

opacity=0.6,

)

viewer.add_labels(

livenucleilabels.astype(int),

name=‘live nuclei’,

blending=‘additive’,

opacity=0.6,

)

viewer.add_labels(

label_organoids.astype(int),

name=‘Organoids_labels’,

blending=‘additive’,

opacity=0.6,

)

napari.run()

knio.outputtables[0] = knio.Table.frompandas(inputtable1.copy())

Here is the knime.log:

2024-01-11 11:04:00,272 : ERROR : KNIME-Worker-21-Python Script 3:543 : : Node : Python Script : 3:543 : Error while sending a command.

org.knime.core.node.KNIMEException: Error while sending a command.

at org.knime.python3.scripting.nodes2.PythonScriptNodeModel.execute(PythonScriptNodeModel.java:194)

at org.knime.core.node.NodeModel.executeModel(NodeModel.java:588)

at org.knime.core.node.Node.invokeFullyNodeModelExecute(Node.java:1297)

at org.knime.core.node.Node.execute(Node.java:1059)

at org.knime.core.node.workflow.NativeNodeContainer.performExecuteNode(NativeNodeContainer.java:595)

at org.knime.core.node.exec.LocalNodeExecutionJob.mainExecute(LocalNodeExecutionJob.java:98)

at org.knime.core.node.workflow.NodeExecutionJob.internalRun(NodeExecutionJob.java:201)

at org.knime.core.node.workflow.NodeExecutionJob.run(NodeExecutionJob.java:117)

at org.knime.core.util.ThreadUtils$RunnableWithContextImpl.runWithContext(ThreadUtils.java:367)

at org.knime.core.util.ThreadUtils$RunnableWithContext.run(ThreadUtils.java:221)

at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)

at java.base/java.util.concurrent.FutureTask.run(Unknown Source)

at org.knime.core.util.ThreadPool$MyFuture.run(ThreadPool.java:123)

at org.knime.core.util.ThreadPool$Worker.run(ThreadPool.java:246)

Caused by: py4j.Py4JException: Error while sending a command.

at py4j.CallbackClient.sendCommand(CallbackClient.java:397)

at py4j.CallbackClient.sendCommand(CallbackClient.java:356)

at py4j.reflection.PythonProxyHandler.invoke(PythonProxyHandler.java:106)

at jdk.proxy17/jdk.proxy17.$Proxy71.execute(Unknown Source)

at org.knime.python3.scripting.nodes2.PythonScriptingSession.execute(PythonScriptingSession.java:255)

at org.knime.python3.scripting.nodes2.PythonScriptNodeModel.lambda$2(PythonScriptNodeModel.java:205)

at org.knime.core.util.ThreadUtils$CallableWithContextImpl.callWithContext(ThreadUtils.java:383)

at org.knime.core.util.ThreadUtils$CallableWithContext.call(ThreadUtils.java:269)

… 3 more

Caused by: py4j.Py4JNetworkException: Error while sending a command: c

t

execute

simport knime.scripting.io as knio # Copy input to output import napari from tifffile import imread from skimage import transform, imgasfloat, imgasuint import numpy as np inputtable1 = knio.inputtables[0].topandas() inputtable2 = knio.inputtables[1].topandas() imagepaths = sorted(inputtable_1[‘Path’]) #nucleilabelpaths = sorted(inputtable1[‘NucleiSeg’]) #organoidslabelpaths = sorted(inputtable1[‘OrganoidSeg’]) img405 = np.asarray([imread(img) for img in imagepaths if r’Z01C01.tif’ in img]) img488 = np.asarray([imread(img) for img in imagepaths if r’Z01C02.tif’ in img]) img564 = np.asarray([imread(img) for img in imagepaths if r’Z01C03.tif’ in img]) labelnuclei = np.asarray([imread(img) for img in imagepaths if ‘nuclei_Seg.tif’ in img]).astype(int) labelorganoids = np.asarray([imread(img) for img in imagepaths if ‘organoid_Seg.tif’ in img]).astype(int) grouped = inputtable2.groupby(‘site’) livenucleilabels = np.zeros(label_nuclei.shape) for name, group in grouped: field = int(name[1:])-1 a= np.array(group[‘label’].values).astype(int) #print(group[‘label’]) mask = np.isin(label_nuclei[field], a) livenucleilabels[field] = label_nuclei[field]*mask #print(group[‘label’].values) labelnuclei[labelnuclei>0] = 1 viewer = napari.Viewer() viewer.add_image( img_405, #contrast_limits=[200, 5200], name=‘Nuclei’, colormap=‘gray’, blending=‘additive’ ) viewer.add_image( img_488, #contrast_limits=[200, 5200], name=‘Yap Ab’, colormap=‘green’, blending=‘additive’ ) viewer.add_image( img_564, #contrast_limits=[200, 5200], name=‘mCherry’, colormap=‘red’, blending=‘additive’ ) viewer.add_labels( label_nuclei, name=‘nuclei_labels’, blending=‘additive’, opacity=0.6, ) viewer.add_labels( livenucleilabels.astype(int), name=‘live nuclei’, blending=‘additive’, opacity=0.6, ) viewer.add_labels( label_organoids.astype(int), name=‘Organoids_labels’, blending=‘additive’, opacity=0.6, ) napari.run() knio.outputtables[0] = knio.Table.frompandas(inputtable1.copy())

btrue

e

at py4j.ClientServerConnection.sendCommand(ClientServerConnection.java:253)
at py4j.CallbackClient.sendCommand(CallbackClient.java:384)
... 10 more

Caused by: py4j.Py4JException: Received empty command

at py4j.ClientServerConnection.sendCommand(ClientServerConnection.java:236)

… 11 more