如果我从终端手动运行它,则以下脚本运行完美。
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
,则错误仍然存在答案 0 :(得分:2)
如果您希望进程'stdin成为管道,则必须明确请求它:
(Just input, _, _, _) <- createProcess ((proc "python" ["mplayer.py"]) { std_in = CreatePipe })
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 。