2012-04-23 71 views
2

我有在內存中的以下路徑:我想用它作爲CMD參數編碼的Unicode路徑打破它

video_path = u'C:\\Documents and Settings\\user\\My Documents\\Downloads\\\xf5iv - Neon Phoenix [Free DL].mp3' 

,所以我必須要對其進行編碼。

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

Windows使用Unicode路徑。你爲什麼編碼你的Unicode字符串? – 2012-04-23 21:51:58

+1

@André:它使用「Unicode」,而不是Unicode。 – 2012-04-23 21:54:53

+0

現在我在猜測,但如果你將'video_path'作爲一個unicode對象(不編碼它),將'cmd = u'..'%videopath'作爲一個Unicode來構造,然後在末尾進行編碼會發生什麼? '使用os.system(cmd.encode(sys.getfilesystemencoding()))'?在Linux和Python 2.7上它沒有區別,但它可能值得您在平臺上嘗試。 – jogojapan 2012-04-25 06:14:05

回答

2

從一個答案here

在Py3K - 從 「巨蟒」 至少3.2 - subprocess.Popen和sys.argv中 工作始終與(缺省Unicode)在Windows海峽的。 明顯使用CreateProcessW和GetCommandLineW。

在Python - 至多v2.7.2至少 - subprocess.Popen與 unicode參數的越野車。它堅持CreateProcessA(而操作系統*是 與unicode一致)。 shlex.split創建了額外的廢話。 Pywin32的win32process.CreateProcess也不會自動切換到W 版本,也沒有win32process.CreateProcessW。與 GetCommandLine相同。因此ctypes.windll.kernel32.CreateProcessW ...需要使用 。子進程模塊或許應該被固定爲關於這個 問題。

因此,subprocess.Popen不能處理在Python的2.X版本的Unicode權。

我的解決方案是將輸入文件重命名爲隨機數(使用os.rename,它支持Unicode),使用ffmpeg進行轉換,我使用subprocess.Popen啓動,然後重新命名。

0

嘗試使用UTF-8編碼:

video_path = video_path.encode("utf-8") 
+6

Windows不在其文件系統中使用UTF-8。 – 2012-04-23 21:54:21

0

除非我完全錯了,在

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

雙反斜線導致問題。應該只有一個:

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

否則反斜槓被保存爲一個反斜槓和離開os.system(),而不是.encode(),來應對。

+0

我不知道爲什麼stackoverflow將它顯示爲兩個斜槓 - 如果您查看代碼,則有三個反斜槓。一個逃脫第一個反斜槓,第三個逃脫unicode字符。 – iTayb 2012-04-25 05:45:01

+0

@iTayb有趣的。但無論如何,不​​應該是一個反斜槓足夠? – jogojapan 2012-04-25 05:55:16

+0

@iTayb。對不起。不,我現在明白了。 – jogojapan 2012-04-25 05:55:59