2012-02-22 10 views
2

私は別の(第三者)バイナリを実行する必要があるHaskellプログラムを持っています。このバイナリは、その出力をコマンドライン引数として提供されるファイルに書き込みます(STDOUTに書き込むつもりはありません)。私はSystem.Cmdでこのバイナリを呼び出すことができますが、withTemporaryDirectoryの型にはかなり不思議です。すなわち:System.Cmd一方Haskellで一時ディレクトリを使用するサブプロセスを実行するにはどうすればよいですか?

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

は、単に私を与える:

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

(ここで有用変わらないだけでなく、システムを)。

私はちょうどこれらを結ぶ方法を考え出していません。私はtempディレクトリ(このバイナリはCWD全体を捨てるのが好きです)を作成し、バイナリを実行し、出力ファイルから読み込みます(問題のバイナリの引数としてその名前を指定します)。一時ディレクトリとその内容を吹き飛ばす。

私は、記述したすべてのものを実行するために、(Filepath - > IO a)型の関数を記述する必要がありますか?誰もがこの効果をもたらす良い例はありますか?

この場合、使用されるバイナリはPsiPred(タンパク質の二次構造予測)であり、そのソースは利用可能ですが、変更する必要はありません。私たちが取り組んでいるこのソフトウェアは、タンパク質における遠隔相同性検出のためのコンピュータ生物学プログラムです。

答えて

3

FilePathは、Stringとしてtypdefedされています。 withTemporaryDirectoryは、最初の引数でmkdtemp(3)を呼び出した場合と同様に動作し、その結果を使用して2番目の引数(テンプレートが適用されたパスを取得し、それにIOアクションを実行する関数)を呼び出します。内部関数が終了すると、そのディレクトリは削除されます。

あなたのケースでは、withTemporaryDirectoryを使用し、それに渡す関数内で、一時ディレクトリにディレクトリを変更し、実際にPsiPredを実行して、古いものに戻します。

0

System.Cmdsystemのより一般的なバージョン、すなわちcreateProcessrunProcessを含むモジュールSystem.Processを含むパッケージprocess、の一部です。どちらも作業ディレクトリなどを指定することができます。 System.Process

関連する問題