2

我在内存中确实有以下路径:

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)

但是,字符串没有以正确的方式编码 - 它转换为\xf5to?而不是õ. 因此找不到该文件。

这怎么可能发生?我正在使用默认的文件系统编码(即 mbcs)。

4

3 回答 3

2

从这里的答案:

在 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 模块可能应该解决这个问题。

因此,subprocess.Popen无法在 Python 2.x 版本中处理 unicode。

我的解决方案是将输入文件重命名为随机文件(使用os.rename,支持 unicode),使用ffmpeg我启动的文件进行转换subprocess.Popen,然后将其重命名。

于 2012-04-28T05:18:54.317 回答
0

尝试使用 UTF-8 进行编码:

video_path = video_path.encode("utf-8")
于 2012-04-23T21:53:11.897 回答
0

除非我完全弄错了,否则中的双反斜杠

video_path = u'C:...\\xf5iv...'

导致问题。应该只有一个:

video_path = u'C:...\xf5iv...'

否则,反斜杠将保留为反斜杠并留给os.system(),而不是.encode(),来处理。

于 2012-04-24T03:44:42.083 回答