That's not going to be sufficient; you could end up in a deadlock by not flushing the output buffer of the child process. Have a look at the implementation of readProcess to see how to deal with some of these tricky issues in the lazy I/O world:
Something like this would work:import System.Processimport System.IOimport System.ExitreadExecOutput :: String -> [String] -> IO ()readExecOutput cmdName cmdOptions = do(_, Just hOut, _, jHandle) <-createProcess (proc cmdName cmdOptions){ cwd = Just ".", std_out = CreatePipe}exitCode <- waitForProcess jHandleexec_output <- hGetContents hOutcase exitCode ofExitSuccess -> putStr $ "Success!\n" ++ exec_output_ -> putStrLn "Command failed"Derek.
On Thursday, 11 December 2014 13:29:34 UTC, Ernesto Rodriguez wrote:ErnestoBest regards,Hi Michael,Thank you for your answer. Conduits certainly are the best approach, but the output I am going to read is very short and the external program will only be called once or twice per execution so I think Lazy IO won't be problematic here.On Thu, Dec 11, 2014 at 10:18 AM, Michael Snoyman <mic...@snoyman.com> wrote:You can use readProcess[1], but it has some downsides:1. Can't specify all options to CreateProcess, e.g., working directory and environment variables.2. Relies on lazy I/OI use Data.Conduit.Process[2] for this kind of thing, which has a full tutorial[3]. However, it *does* involve non-base dependencies.[2] http://www.stackage.org/haddock/2014-12-10-ghc78-exc/conduit-extra-1.1.4.2/Data-Conduit-Process.html[3] https://www.fpcomplete.com/user/snoyberg/library-documentation/data-conduit-process?show=tutorialsOn Thu Dec 11 2014 at 11:11:12 AM Ernesto Rodriguez <ne...@netowork.me> wrote:_______________________________________________Best,Dear All,I have a program which invokes an external program via exec. I wish to capture the standard output of the program without using external (temporary) files. Is it possible to create an in memory handle which I can tell exec to use as standard output of the invoked program. It would be great if it can be done without any extra dependencies.
--Ernesto RodriguezMasters StudentComputer ScienceUtrecht University
Haskell-Cafe mailing list
--Ernesto RodriguezMasters StudentComputer ScienceUtrecht University