我还没有让 rc 接口在 Windows 上使用管道标准输入/标准输出;我在所有尝试communicate 或直接写信给stdin 时都会收到IOError。有一个选项--rc-fake-tty 可以让 rc 接口在 Linux 上编写脚本,但它在 Windows 中不可用——至少在我有些过时的 VLC 版本(1.1.4)中不可用。另一方面,使用套接字接口似乎工作正常。
分配给startupinfo 选项并由Win32 CreateProcess 函数使用的结构可以配置为隐藏进程窗口。但是,对于 VLC rc 控制台,我认为使用现有的--rc-quiet 选项更简单。一般来说,下面是配置startupinfo隐藏进程窗口的方法:
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
subprocess.Popen(cmd, startupinfo=startupinfo)
为了完整起见——如果在您的系统上使用管道也失败了——这是我使用--rc-host 选项制作的一个小演示,以使用套接字进行通信。它还使用--rc-quiet 隐藏控制台。这只是打印帮助并退出。我没有测试任何其他东西。我检查了它是否适用于 Python 2.7.2 和 3.2.2 版本。 (我知道你没有要求这个,但也许它对你还是有用的。)
import socket
import subprocess
from select import select
try:
import winreg
except ImportError:
import _winreg as winreg
def _get_vlc_path():
views = [(winreg.HKEY_CURRENT_USER, 0),
(winreg.HKEY_LOCAL_MACHINE, winreg.KEY_WOW64_64KEY),
(winreg.HKEY_LOCAL_MACHINE, winreg.KEY_WOW64_32KEY)]
subkey = r'Software\VideoLAN\VLC'
access = winreg.KEY_QUERY_VALUE
for hroot, flag in views:
try:
with winreg.OpenKey(hroot, subkey, 0, access | flag) as hkey:
value, type_id = winreg.QueryValueEx(hkey, None)
if type_id == winreg.REG_SZ:
return value
except WindowsError:
pass
raise SystemExit("Error: VLC not found.")
g_vlc_path = _get_vlc_path()
def send_command(sock, cmd, get_result=False):
try:
cmd = (cmd + '\n').encode('ascii')
except AttributeError:
cmd += b'\n'
sent = total = sock.send(cmd)
while total < len(cmd):
sent = sock.send(cmd[total:])
if sent == 0:
raise socket.error('Socket connection broken.')
total += sent
if get_result:
return receive_result(sock)
def receive_result(sock):
data = bytearray()
sock.setblocking(0)
while select([sock], [], [], 1.0)[0]:
chunk = sock.recv(1024)
if chunk == b'':
raise socket.error('Socket connection broken.')
data.extend(chunk)
sock.setblocking(1)
return data.decode('utf-8')
def main(address, port):
import time
rc_host = '{0}:{1}'.format(address, port)
vlc = subprocess.Popen([g_vlc_path, '-I', 'rc', '--rc-host', rc_host,
'--rc-quiet'])
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
sock.connect((address, port))
help_msg = send_command(sock, 'help', True)
print(help_msg)
send_command(sock, 'quit')
except socket.error as e:
exit("Error: " + e.args[0])
finally:
sock.close()
time.sleep(0.5)
if vlc.poll() is None:
vlc.terminate()
if __name__ == '__main__':
main('localhost', 12345)