I am probably missing something obvious but I cannot seem to figure out
how to use run-process with output redirected to a pipe. Based on my reading of the manual, I have: (let ((p (run-process "echo Hello" out-to: 'pipe))) (p:getInputStream)) but it give an error (full trace below) that I can't quite interpret: java.lang.IllegalAccessException: Class gnu.expr.PrimProcedure can not access a member of class java.lang.UNIXProcess with modifiers "public" I would be grateful if someone could point me to some code illustrating the use of the pipe feature of run-process. Regards, -chaw Stack trace: w.scm:3:4: warning - no known slot 'getInputStream' in java.lang.Object java.lang.IllegalAccessException: Class gnu.expr.PrimProcedure can not access a member of class java.lang.UNIXProcess with modifiers "public" at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102) at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296) at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288) at java.lang.reflect.Method.invoke(Method.java:491) at gnu.expr.PrimProcedure.applyToConsumerX(PrimProcedure.java:310) at gnu.expr.PrimProcedure.applyToConsumer(PrimProcedure.java:189) at gnu.mapping.CallContext.runUntilDone(CallContext.java:586) at gnu.mapping.CallContext.runUntilValue(CallContext.java:669) at gnu.mapping.Procedure.applyN(Procedure.java:136) at gnu.kawa.functions.NamedPart.applyN(NamedPart.java:90) at gnu.mapping.ProcedureN.applyToObject(ProcedureN.java:45) at gnu.mapping.Procedure.applyToConsumerDefault(Procedure.java:75) at gnu.kawa.functions.ApplyToArgs.applyToConsumerA2A(ApplyToArgs.java:132) at gnu.mapping.CallContext.runUntilDone(CallContext.java:586) at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:343) at gnu.expr.CompiledModule.evalModule(CompiledModule.java:42) at gnu.expr.CompiledModule.evalModule(CompiledModule.java:60) at kawa.Shell.runFile(Shell.java:571) at kawa.Shell.runFileOrClass(Shell.java:474) at kawa.repl.processArgs(repl.java:710) at kawa.repl.main(repl.java:830) |
Hello. I am also new to kawa, and I don't know why it behaves the way it does (seems a java permissions thing to me), but you can get the InputStream using:
(gnu.kawa.functions.RunProcess:getInputStreamFrom p) I found this using "grep -r Stream" inside the Kawa/kawa/lib directory in the kawa source code, which I found to be a great learning resource. ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐ On Friday, August 23, 2019 7:53 PM, Sudarshan S Chawathe <[hidden email]> wrote: > I am probably missing something obvious but I cannot seem to figure out > how to use run-process with output redirected to a pipe. > > Based on my reading of the manual, I have: > > (let ((p (run-process "echo Hello" > out-to: 'pipe))) > (p:getInputStream)) > > but it give an error (full trace below) that I can't quite interpret: > > java.lang.IllegalAccessException: Class gnu.expr.PrimProcedure can not > access a member of class java.lang.UNIXProcess with modifiers "public" > > I would be grateful if someone could point me to some code illustrating > the use of the pipe feature of run-process. > > Regards, > > -chaw > > Stack trace: > > w.scm:3:4: warning - no known slot 'getInputStream' in java.lang.Object > java.lang.IllegalAccessException: Class gnu.expr.PrimProcedure can not access a member of class java.lang.UNIXProcess with modifiers "public" > at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102) > at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296) > at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288) > at java.lang.reflect.Method.invoke(Method.java:491) > at gnu.expr.PrimProcedure.applyToConsumerX(PrimProcedure.java:310) > at gnu.expr.PrimProcedure.applyToConsumer(PrimProcedure.java:189) > at gnu.mapping.CallContext.runUntilDone(CallContext.java:586) > at gnu.mapping.CallContext.runUntilValue(CallContext.java:669) > at gnu.mapping.Procedure.applyN(Procedure.java:136) > at gnu.kawa.functions.NamedPart.applyN(NamedPart.java:90) > at gnu.mapping.ProcedureN.applyToObject(ProcedureN.java:45) > at gnu.mapping.Procedure.applyToConsumerDefault(Procedure.java:75) > at gnu.kawa.functions.ApplyToArgs.applyToConsumerA2A(ApplyToArgs.java:132) > at gnu.mapping.CallContext.runUntilDone(CallContext.java:586) > at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:343) > at gnu.expr.CompiledModule.evalModule(CompiledModule.java:42) > at gnu.expr.CompiledModule.evalModule(CompiledModule.java:60) > at kawa.Shell.runFile(Shell.java:571) > at kawa.Shell.runFileOrClass(Shell.java:474) > at kawa.repl.processArgs(repl.java:710) > at kawa.repl.main(repl.java:830) |
Thank you very much for the hint; it indeed works when invoked as you
write. Regards, -chaw > Date: Sat, 24 Aug 2019 11:01:13 +0000 > From: spellcard199 <[hidden email]> > Subject: Re: Example of run-process with redirection to pipe? > > Hello. I am also new to kawa, and I don't know why it behaves the way it do= > es (seems a java permissions thing to me), but you can get the InputStream = > using: > > (gnu.kawa.functions.RunProcess:getInputStreamFrom p) > > I found this using "grep -r Stream" inside the Kawa/kawa/lib directory in t= > he kawa source code, which I found to be a great learning resource. > |
I checked in a fix for this - the original test program now works.
This was somewhat tricky because the actual runtime-class UNIXProcess is non-public, so reflection has to use the method from the parent class Process. Which lead to to messy complication relating to "syntheic bridge" methods. Hope I got it right ... A further improvement would be to do the method lookup at compile-time. -- --Per Bothner [hidden email] http://per.bothner.com/ |
Free forum by Nabble | Edit this page |