From: Jeremy Bopp Date: 2010-10-08T04:21:27+09:00 Subject: Re: popen hangs out for user input On 10/7/2010 2:07 PM, Jeremy Bopp wrote: > On 10/7/2010 1:40 PM, felix.leg wrote: >> Hi, >> >> I want to use Ruby with latex,so I wrote a simple program which waits >> for "\typein" command called from pdflatex: >> >> >> #!/usr/bin/ruby >> >> file = IO.popen('pdflatex -interaction scrollmode test.tex','r+') #1 >> >> until file.readline.include? 'typein'; end >> file.write "a line from RUBY" >> file.readlines #2 >> file.close >> >> >> If I run the command from #1 in a sheel it works right: scrolls >> "standard" latex asks, and stops for my "\@typein=". After I answer it >> continues normally. >> >> But when I want do the same in Ruby with above code, it hangs out >> waiting for input. It looks like #2 causes this, but I don't know why... > > It's probably because the write buffer for the pipe is not being > flushed. My preferred option to fix this sort of thing is to make the > file object synchronous: > > file = IO.popen(.....) > file.sync = true > > However, you might prefer to explicitly flush things instead: > > file.write(.....) > file.flush > ... > file.write(.....) > file.write(.....) > file.flush One more thing: you may need to insert a newline at the end of the strings you write or use #puts instead of #write. Most interactive programs like this expect a newline character to flag the end of data entry for a field. -Jeremy