Hi,
has anyone tried to actually write an ImageJ op in Jython? Since it appears that ImageJ Jython interpreter can handle Java annotations, do I need to wrap my python class in Java class?
I have tried the following, but it did not work:
# @PluginService plugin
# @OpService op
from net.imagej.ops import AbstractOp
from net.imagej.ops import Op
from org.scijava import ItemIO
from org.scijava.plugin import Parameter
from org.scijava.plugin import Plugin
from org.scijava.plugin import PluginInfo
# @Plugin(type = Op.class, name = "narf")
class Narf(AbstractOp):
# @Parameter input
# @Parameter(type = ItemIO.OUTPUT) output
def run(self):
output = "Egads! " + input.upper()
narfInfo = PluginInfo(Narf.__class__, Op.__class__)
plugin.addPlugin(narfInfo)
result = op.run("narf", "Put some trousers on")
Traceback (most recent call last):
File "/Users/radoslaw.ejsmont/Desktop/op.py", line 23, in <module>
result = op.run("narf", "Put some trousers on")
at net.imagej.ops.DefaultOpMatchingService.assertCandidates(DefaultOpMatchingService.java:235)
at net.imagej.ops.DefaultOpMatchingService.findMatch(DefaultOpMatchingService.java:93)
at net.imagej.ops.DefaultOpMatchingService.findMatch(DefaultOpMatchingService.java:84)
at net.imagej.ops.OpEnvironment.module(OpEnvironment.java:252)
at net.imagej.ops.OpEnvironment.run(OpEnvironment.java:135)
at sun.reflect.GeneratedMethodAccessor24.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
java.lang.IllegalArgumentException: java.lang.IllegalArgumentException: No candidate 'narf' ops
at org.python.core.Py.JavaError(Py.java:546)
at org.python.core.Py.JavaError(Py.java:537)
at org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:188)
at org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:204)
at org.python.core.PyObject.__call__(PyObject.java:496)
at org.python.core.PyObject.__call__(PyObject.java:500)
at org.python.core.PyMethod.__call__(PyMethod.java:156)
at org.python.pycode._pyx8.f$0(/Users/radoslaw.ejsmont/Desktop/op.py:23)
at org.python.pycode._pyx8.call_function(/Users/radoslaw.ejsmont/Desktop/op.py)
at org.python.core.PyTableCode.call(PyTableCode.java:167)
at org.python.core.PyCode.call(PyCode.java:18)
at org.python.core.Py.runCode(Py.java:1386)
at org.python.core.__builtin__.eval(__builtin__.java:497)
at org.python.core.__builtin__.eval(__builtin__.java:501)
at org.python.util.PythonInterpreter.eval(PythonInterpreter.java:259)
at org.python.jsr223.PyScriptEngine.eval(PyScriptEngine.java:40)
at org.python.jsr223.PyScriptEngine.eval(PyScriptEngine.java:31)
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
at org.scijava.script.ScriptModule.run(ScriptModule.java:159)
at org.scijava.module.ModuleRunner.run(ModuleRunner.java:167)
at org.scijava.module.ModuleRunner.call(ModuleRunner.java:126)
at org.scijava.module.ModuleRunner.call(ModuleRunner.java:65)
at org.scijava.thread.DefaultThreadService$3.call(DefaultThreadService.java:237)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Is this even possible? Should I rather port my script to Java?
Cheers,
Radek