Как мне запустить подпроцессы, которые используют временные каталоги в Haskell? - PullRequest
2 голосов
/ 22 февраля 2012

У меня есть программа на Haskell, которая должна выполнять отдельный (сторонний) двоичный файл;этот двоичный файл будет записывать свои выходные данные в файл, предоставленный в качестве аргумента командной строки (он, похоже, не желает писать в STDOUT).Я вижу, что System.Cmd позволит мне вызывать этот двоичный файл, но я весьма озадачен типом withTeoraryDirectory.А именно:

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

, тогда как System.Cmd просто дает мне:

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

(а также систему, которая в данном случае не отличается от других).

Я просто пытаюсь понять, как их соединить;Я хочу создать временный каталог (этот двоичный файл любит рвать на всем протяжении его CWD), запустить двоичный файл, прочитать из его выходного файла (я буду знать его имя, когда я предоставлю это в качестве аргумента для рассматриваемого двоичного файла), а затемвзорвать временный каталог и его содержимое.

Итак, я должен написать функцию, тип которой (Filepath -> IO a), чтобы выполнить все то, что я описал?Есть ли какие-нибудь хорошие примеры, которые кто-нибудь может привести в этом отношении?

В этом случае используется двоичный файл PsiPred (предсказание вторичной структуры белка), и хотя его источник доступен, я бы предпочел не изменять его.Это программное обеспечение, над которым мы работаем, является программой вычислительной биологии для дистанционного обнаружения гомологии в белках.

Ответы [ 2 ]

3 голосов
/ 22 февраля 2012

FilePath набирается как String.withTemporaryDirectory работает так, как если бы вы вызывали mkdtemp(3) с его первым аргументом, а затем использовали его результат для вызова второго аргумента (функция берет путь с примененным шаблоном и выполняет с ним IO-действие).После того, как внутренняя функция завершается, каталог удаляется.

В вашем случае я бы предположил, что вы должны использовать withTeoraryDirectory, а затем внутри функции, которую вы ей передаете, изменить каталоги на временные, фактически запустив PsiPred,а затем вернитесь к старому.

0 голосов
/ 22 февраля 2012

System.Cmd является частью пакета process, который также содержит модуль System.Process, который содержит более общие версии system, то есть createProcess и runProcess.Оба позволяют указать рабочий каталог и многое другое.См System.Process

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...