Example of run-process with redirection to pipe?

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Example of run-process with redirection to pipe?

Sudarshan S Chawathe
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)

Reply | Threaded
Open this post in threaded view
|

Re: Example of run-process with redirection to pipe?

spellcard199
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)


Reply | Threaded
Open this post in threaded view
|

Re: Example of run-process with redirection to pipe?

Sudarshan S Chawathe
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.
>
Reply | Threaded
Open this post in threaded view
|

Re: Example of run-process with redirection to pipe?

Per Bothner
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/