作为持久子进程运行并调用Python程序

作为持久子进程运行并调用Python程序,python,haskell,subprocess,Python,Haskell,Subprocess,我正在用Haskell编写一个微服务,似乎我们需要调用Python库。我知道如何从Haskell创建和配置一个进程来实现这一点,但我的Python已经过时了。以下是我试图实现的逻辑: Haskell应用程序通过创建一个持久子进程(子进程的生命周期=父进程的生命周期)来初始化,该持久子进程运行一个为Python库服务的最小化应用程序 Haskell应用程序接收一个网络请求,并通过stdin向Python子进程发送恰好1个数据块(即bytestring或text);它等待——阻塞——从子进程的std

我正在用Haskell编写一个微服务,似乎我们需要调用Python库。我知道如何从Haskell创建和配置一个进程来实现这一点,但我的Python已经过时了。以下是我试图实现的逻辑:

  • Haskell应用程序通过创建一个持久子进程(子进程的生命周期=父进程的生命周期)来初始化,该持久子进程运行一个为Python库服务的最小化应用程序
  • Haskell应用程序接收一个网络请求,并通过stdin向Python子进程发送恰好1个数据块(即bytestring或text);它等待——阻塞——从子进程的stdout接收正好1个数据块,收集结果并将其作为响应返回
  • 我环顾四周,找到了最接近的解决方案:

  • 两者都只处理我知道如何处理的部分(即调用Python子进程),而不处理从子进程运行的Python代码的细节——因此这个问题

    显而易见的替代方案是,只要Haskell应用程序需要,就创建、运行和停止一个子流程,但开销令人不快

    我尝试了一些最小化版本如下所示的内容:

    ——来自Haskell父进程
    {-#语言重载字符串}
    导入系统.IO
    导入System.Process.Type
    configProc::ProcessConfig句柄()
    configProc=
    setStdin createPipe$
    setStdout创建管道$
    设置错误关闭$
    setWorkingDir“/工作/目录”$
    shell“python3 my_program.py”
    startPyProc::IO(进程句柄())
    startPyProc=do
    
    p只需将
    print(…)
    替换为
    print(…,flush=True)
    即可修复。在Python中,似乎stdin/stdout默认为块缓冲,这使得我调用了
    hGetLine
    block,因为它需要行。

    为什么你认为它会立即死锁?事实上,你的另一个程序是用Python编写的,这与此无关。它会在我的测试中死锁,但是我想把问题集中在方法上——希望有一些例子——这是建议满足我详细描述的规范的方法。你必须用Python和Haskell创建最少的工作代码,这样我们才能测试它。我不知道任何Python,但我打赌sys.stdin中的line.stdin
    正在等待一行写入stdin。