bwv549 <jtprince / gmail.com> wrote:
> I'm doing some work with pymol and having trouble getting all the
> pymol output out:
> 
> # I open it in quiet/commandline mode with a pipe:
> IO.popen("pymol -cq -p", 'w+') do |pipe|
>   pipe.puts "load file.pdb, mymodel\n"
>   pipe.puts "run my_script.py"
>   # this command will generate a whole bunch of output to stdout
>   pipe.puts "my_script mymodel"
>   sleep(5)  # <--- this is what I have to do in order to get the
> output
>   pipe.close_write
>   output = pipe.read
> end
> 
> What is annoying is that unless I sleep for 2-5 seconds I don't get
> output or (even worse) my output is cut off.  There has to be a way
> besides arbitrarily sleeping to ensure that the command is finished.
> I've tried things like piping in "quit", but that doesn't seem to
> work.  Anybody know how to solve this?  I'm happy to use a different
> approach if it means I can be sure I get all of my output out.   --
> Thanks!

Hi,

I don't know about pymol, but some apps do not respond well to having
its stdin closed on it with close_write.  pipe.read should just block
until you get output, otherwise put an IO.select([pipe) in front of it.

Does this work?

  IO.popen("pymol -cq -p", 'w+') do |pipe|
    pipe.puts "load file.pdb, mymodel\n"
    pipe.puts "run my_script.py"
    pipe.puts "my_script mymodel"

    # IO.select([pipe]) # you shouldn't need to uncomment this...

    output = pipe.read
  end

-- 
Eric Wong