查看此代码的工作情况(没有
b
s) 在2.7中,我只能假设将字符串编码为字节是在某种程度上改变字节值,这样mplayer就无法理解它了?
'pause\n'
在Python 2中是
确切地
与相同的值
b'pause\n'
--此外,您可以使用
b'暂停\n'
在Python 2上(以传达代码的意图)。
不同的是
bufsize=0
在Python 2上,因此
.write()
将内容立即推送到子流程
.写入()
在Python 3上,将其放在一些内部缓冲区中。添加
.flush()
调用,以清空缓冲区。
通过
universal_newlines=True
,以在Python 3上启用文本模式(然后可以使用
'暂停\n'
而不是
b'暂停\n'
). 如果
mplayer
期望
os.newline
而不是
b'\n'
作为行尾。
#!/usr/bin/env python3
import time
from subprocess import Popen, PIPE
LINE_BUFFERED = 1
filename = r"C:\Users\me\...Afton.mp3"
with Popen('mplayer -slave -quiet'.split() + [filename],
stdin=PIPE, universal_newlines=True, bufsize=LINE_BUFFERED) as process:
send_command = lambda command: print(command, flush=True, file=process.stdin)
time.sleep(1)
for _ in range(2):
send_command('pause')
time.sleep(1)
send_command('quit')
无关:不使用
stdout=PIPE
除非从管道中读取,否则可能会挂起子进程。要放弃输出,请使用
stdout=subprocess.DEVNULL
相反看见
How to hide output of subprocess in Python 2.7