gpt4 book ai didi

python - 如何使用unicode版本Windows API : mciSendString(), Python

转载 作者:太空宇宙 更新时间:2023-11-03 20:12:02 29 4
gpt4 key购买 nike

我正在 Windows 10 上测试 Python 包:playsound

路径名的某些字符似乎有问题,例如“c:\sauté”和宽字符。所以它找不到文件。

Error 275 for command: open "C:\sauté.wav" alias playsound_0.4091468603477375 Cannot find the specified file. Make sure the path and filename are correct.

我尝试使用 unicode 版本mciSendStringW()。事实证明 mciSendStringW 根本无法识别编码的命令。我不知道现在还能做什么。

def winCommand(*command):
buf = c_buffer(255)
command = ' '.join(command).encode(getfilesystemencoding())
errorCode = int(windll.winmm.mciSendStringA(command, buf, 254, 0))
if errorCode:
errorBuffer = c_buffer(255)
windll.winmm.mciGetErrorStringA(errorCode, errorBuffer, 254)
exceptionMessage = ('\n Error ' + str(errorCode) + ' for command:'
'\n ' + command.decode() +
'\n ' + errorBuffer.value.decode())
raise PlaysoundException(exceptionMessage)
return buf.value

项目站点:https://pypi.org/project/playsound/ (包括安装和快速入门指南)

源代码:https://raw.githubusercontent.com/TaylorSMarks/playsound/master/playsound.py

微软mciSendString函数: https://learn.microsoft.com/en-us/previous-versions/dd757161(v=vs.85)

最佳答案

使用 Wide 函数 mciSendStringW 时,不应对字符串进行编码。因此,您的行应该简单地读取 command = ' '.join(command)。至少在我使用 Python 3.6 的 Windows10 机器上是这样。

要仔细检查,您可以运行下面的代码。第二个错误代码为 296,这只是提示文件类型错误,因为我们创建了一个空文件进行测试。

from ctypes import c_buffer, windll
from sys import getfilesystemencoding

if __name__ == '__main__':
buf = c_buffer(255)
filesystemencoding = getfilesystemencoding()
filename = r'.\sauté.wav'
# create the file if it doesn't exist
file = open(filename, 'w+')
file.close()

# ASCII
command = 'open ' + filename
byte_string_command = command.encode(filesystemencoding)

errorCode = int(windll.winmm.mciSendStringA(byte_string_command, buf, 254, 0))
# errorCode should be 275: Cannot find the file
errorBuffer = c_buffer(255)
windll.winmm.mciGetErrorStringA(errorCode, errorBuffer, 254)
print("{}: {}".format(errorCode, errorBuffer.value.decode()))

# Unicode
errorCode = int(windll.winmm.mciSendStringW(command, buf, 254, 0))
# errorCode should be 296: The specified file cannot be played
errorBuffer = c_buffer(255)
windll.winmm.mciGetErrorStringA(errorCode, errorBuffer, 254)
print("{}: {}".format(errorCode, errorBuffer.value.decode()))

关于python - 如何使用unicode版本Windows API : mciSendString(), Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58659364/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com