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 moreCaused by: py4j.Py4JException: Received empty command
at py4j.ClientServerConnection.sendCommand(ClientServerConnection.java:236)
… 11 more