From: Kevin J. B. <jyt...@sa...> - 2003-05-01 14:52:46
|
From: Jingzhao Ou <ja...@ya...> >I am using WindowsXP. I am using jython CVS version on Cygwin. I got the >following. Even though there is no error message, there is nothing happening >either. Any thing wrong? Thanks! You really should use either os.system or the os.popen* or popen2.popen* methods. They are much easier to use, do what you really want, will save you a lot of heartache, and they're standard Python to boot! :-) >================================================================= >$ jython >Jython 2.1+ on java1.4.0_01-ea (JIT: null) >Type "copyright", "credits" or "license" for more information. > >>>>>>> from java.lang import Runtime >>>>>>> Runtime.getRuntime().exec("cmd.exe /cecho hello") > >java.lang.Win32Process@dc4cd9 > >>>>>>> Runtime.getRuntime().exec("cmd.exe") > >java.lang.Win32Process@c6b8b0 > >>>>>>> Runtime.getRuntime().exec("dir") > >java.lang.Win32Process@baf4ae > >>>>>>> print Runtime.getRuntime().exec("dir") > >java.lang.Win32Process@3e6f83 > >>>>>>> > >================================================================== You're expecting their output to go directly to your stdout, right? You want os.system. You have spawned several processes, but you are not reading their output. Using "exec", it is the program's responsibility to read the output explicitly. If you really want to use Runtime.exec directly, you need to do: proc = Runtime.getRuntime().exec( command ) to_proc = proc.getOutputStream() from_proc = proc.getInputStream() err_proc = proc.getErrorStream() # note this is broken - see below! output = org.python.core.PyFile( from_proc ) print output.read() error = org.python.core.PyFile( err_proc ) print error.read() This only works if your output and error sizes are less than the OS buffer size. If the process generates more output than that, and you don't read it, the process will appear to hang when it blocks trying to write to the full buffer. See javashell and popen2 in CVS for how to spawn threads to circumvent that blocking IO, then don't bother re-implementing it and just use it via the os.system and popen* methods... ;-) kb |