如何在Haskell中运行使用临时目录的子进程?

时间:2012-02-22 04:42:50

标签: subprocess haskell

我有一个需要执行单独(第三方)二进制文件的Haskell程序;这个二进制文件会将其输出写入一个作为命令行参数提供的文件(它似乎不愿意写入STDOUT)。我看到System.Cmd将允许我调用这个二进制文件,但我对withTemporaryDirectory的类型感到非常困惑。即:

withTemporaryDirectory :: FilePath -> (FilePath -> IO a) -> IO a

而System.Cmd只给了我:

rawSystem :: String -> [String] -> IO ExitCode

(以及系统,在这种情况下,它没有用处)。

我只是想弄清楚如何连接它们;我想创建一个临时目录(这个二进制文件喜欢在其CWD上呕吐),运行二进制文件,从其输出文件中读取(我知道它的名称,因为我提供了它作为所讨论的二进制文件的参数)然后吹掉临时目录及其内容。

那么,我应该编写一个类型为(Filepath - > IO a)的函数来完成我描述的所有内容吗?有没有任何好的例子可以提供这种效果?

在这种情况下,使用的二进制文件是PsiPred(蛋白质二级结构预测),虽然它的来源可用,但我不必修改它。我们正在开发的这个软件是一个用于蛋白质远程同源检测的计算生物学程序。

2 个答案:

答案 0 :(得分:3)

FilePath代表StringwithTemporaryDirectory的工作方式就像您使用第一个参数调用mkdtemp(3)一样,然后使用其结果调用第二个参数(一个函数采用应用了模板的路径,并使用它运行IO操作)。内部函数终止后,目录将被删除。

在你的情况下,我认为你应该使用withTemporaryDirectory,然后在传递给它的函数内部,将目录更改为临时目录,实际运行PsiPred,然后更改回旧版本。

答案 1 :(得分:0)

System.Cmd是软件包process的一部分,其中还包含模块System.Process,其中包含system的更多常规版本,即createProcess和{{ 1}}。两者都允许指定工作目录等等。见System.Process