最接近 Haskell 中的 subprocess.communicate

发布于 2024-08-10 18:39:05 字数 112 浏览 10 评论 0 原文

我想做一个 popen() / python 的 subprocess.communicate 从 Haskell - 启动一个程序,给它标准输入,并获取它的标准输出/标准错误。最直接/哈斯克尔式的方法是什么?

I want to do a popen() / python's subprocess.communicate from Haskell - start a program, give it stdin, and get its stdout/stderr. What's the most direct / Haskellish way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

无敌元气妹 2024-08-17 18:39:06

选择 MissingHSystem.Cmd.Utils 和标准库的 System.Process。它们很容易使用,具有高级便利函数(您只需向其抛出字符串并返回字符串,可能是懒惰的)和低级管道函数(实际上为您提供句柄,就像大多数 popen 其他语言/框架中的函数)。

import System.Process

main = do
    let cmd = "mail"
        args = ["root@localhost", "-s", "does this act like popen?"]
        input = ["Hello, world!"]
    (rc, out, err) <- readProcessWithExitCode cmd args input
    putStrLn $ "mail exited: " ++ show rc
    mapM_ putStrLn $ map ("out: " ++) $ lines out
    mapM_ putStrLn $ map ("err: " ++) $ lines err

Pick either MissingH's System.Cmd.Utils and the standard library's System.Process. They're easy to use, with both high-level convenience functions (which you simply throw strings at and get strings back, possibly lazily) and low-level plumbing functions (which actually give you handles, like most popen functions in other languages/frameworks).

import System.Process

main = do
    let cmd = "mail"
        args = ["root@localhost", "-s", "does this act like popen?"]
        input = ["Hello, world!"]
    (rc, out, err) <- readProcessWithExitCode cmd args input
    putStrLn $ "mail exited: " ++ show rc
    mapM_ putStrLn $ map ("out: " ++) $ lines out
    mapM_ putStrLn $ map ("err: " ++) $ lines err
萌酱 2024-08-17 18:39:06

另一种选择是使用 shelly

The other option could be to use shelly package

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文