" IOError:[Errno 5]输入/输出错误"从haskell System.Process调用python-program时

时间:2017-01-15 17:28:55

标签: python haskell terminal

如果我从终端手动运行它,则以下脚本运行完美。

import sys
import pygame
import pygame.mixer

def play(path):
    pygame.mixer.music.load(path)
    pygame.mixer.music.play(-1)

pygame.mixer.pre_init(44100, -16, 2, 2048)
pygame.init()
pygame.mixer.init()

while True:
    path = sys.stdin.readline()[0:-1]
    play(path)

每当我键入路径时,它就开始播放该文件(并停止播放前一个文件)。

但是当我从这个haskell脚本中调用它时:

import System.Process
import GHC.IO.Handle

main = do
    (Just input, _, _, _) <- createProcess (proc "python" ["mplayer.py"])
    hPutStr input "song.mp3\n"

我收到以下错误消息:

Main: user error (Pattern match failure in do expression at     Main.hs:6:9-29)
gernot@gernot-Aspire-5733Z:~/Dokumente/Projekte/python/music$ Traceback     (most recent call last):
  File "mplayer.py", line 14, in <module>
    path = sys.stdin.readline()[0:-1]
IOError: [Errno 5] Input/output error

我用Google搜索了错误消息,但没有找到任何对python或haskell有用的内容。 无论如何,如果我将一些忙等待添加到haskell-script

,则错误仍然存​​在

1 个答案:

答案 0 :(得分:2)

如果您希望进程'stdin成为管道,则必须明确请求它:

(Just input, _, _, _) <- createProcess ((proc "python" ["mplayer.py"]) { std_in = CreatePipe })

引用the fine documentation

  

createProcess返回( mb_stdin_hdl , mb_stdout_hdl , mb_stderr_hdl {{ 1}} ph ,,其中

     
      
  • 如果),那么 mb_stdin_hdl 将是std_in == CreatePipe h ,其中 h 是写入的结尾管道连接到子进程的Just
  •   
  • 否则, mb_stdin_hdl stdin
  •   
     

同样适用于 mb_stdout_hdl mb_stderr_hdl