我在内存中有以下路径:
video_path = u'C:\\Documents and Settings\\user\\My Documents\\Downloads\\\xf5iv - Neon Phoenix [Free DL].mp3'
我正在尝试将其用作cmd中的参数,因此我必须对其进行编码。
video_path = video_path.encode(sys.getfilesystemencoding())
cmd = 'ffmpeg -y -i "%s" -vn -ac 2 -f mp3 audio.mp3' % video_path
subprocess.Popen(cmd)
但是字符串没有以正确的方式编码 - 它将\xf5
转换为?
而不是õ
。因此无法找到该文件。
这怎么可能发生?我正在使用默认文件系统编码(即mbcs)。
答案 0 :(得分:2)
回答here:
在Py3K中 - 至少来自“Python”3.2 - subprocess.Popen和sys.argv 在Windows上与(默认的unicode)str一致。 显然使用CreateProcessW和GetCommandLineW。
在Python中 - 至少达到v2.7.2 - subprocess.Popen是错误的 unicode参数。它坚持CreateProcessA(而os。*是 与unicode一致)。并且shlex.split会产生额外的废话。 Pywin32的win32process.CreateProcess也不会自动切换到W 版本,也没有win32process.CreateProcessW。与...相同 GetCommandLine。因此ctypes.windll.kernel32.CreateProcessW ...需要 使用。或许应该修复子过程模块 问题。
因此,subprocess.Popen
无法在Python 2.x版本中处理unicode。
我的解决方案是将输入文件重命名为随机(os.rename
,支持unicode),使用ffmpeg
进行转换,然后将其重命名为<{1}}。< / p>
答案 1 :(得分:0)
尝试使用UTF-8进行编码:
video_path = video_path.encode("utf-8")
答案 2 :(得分:0)
除非我完全弄错,否则双击反斜率
video_path = u'C:...\\xf5iv...'
导致问题。应该只有一个:
video_path = u'C:...\xf5iv...'
否则,反斜杠将保留为反斜杠,并留给os.system()
而不是.encode()
来处理。