問題描述
使用python2.7執(zhí)行os.popen()打開系統(tǒng)帶中文參數(shù)命令的時(shí)候報(bào)了參數(shù)不合法,但是把命令打印出來復(fù)制到cmd里面是可以執(zhí)行的。而且把中文換成英文也不會(huì)報(bào)錯(cuò)。
仿照問題做了個(gè)例子復(fù)現(xiàn)如下:
先創(chuàng)建幾個(gè)文件:

然后寫一段代碼進(jìn)行復(fù)制操作:
# -*- coding: utf-8 -*-
import os
cmd = 'copy ' + ' 測(cè)試 '+' /a test' #系統(tǒng)找不到指定文件
# cmd = 'copy ' + ' adf '+' /a test' #正??截?
print cmd
finishInfo = os.popen(cmd).read().decode('gbk')
print finishInfo
解決辦法
1.換python3執(zhí)行(有條件的話)
2.將文件首行的編碼格式改成gbk
3.使用decode
finishInfo = os.popen(cmd.decode('utf-8').encode('gbk')).read().decode('gbk')
先轉(zhuǎn)成unicode,再轉(zhuǎn)成gbk。
- 先使用u前綴將命令聲明為unicode再encode成gbk。
原因探究
這里涉及到三個(gè)地方的編碼,python腳本,運(yùn)行環(huán)境也就是pycharm,cmd。
pycharm里的編碼設(shè)置,參考https://www.jetbrains.com/help/pycharm/settings-file-encodings.html
cmd由于是win10系統(tǒng),默認(rèn)是gbk編碼(也可以設(shè)置)。
py2的里默認(rèn)是用ascii碼編碼腳本,在開頭加上 類似# -- coding: utf-8 --之后,字符串會(huì)按照聲明的字符編碼格式來進(jìn)行編碼。如果不加任何操作這里通過popen管道傳過去的就是utf-8的編碼,這時(shí)到了gbk編碼的cmd中就會(huì)出現(xiàn)亂碼從而找不到文件。
py3中,所有的字符串不再受系統(tǒng)環(huán)境編碼的影響,統(tǒng)一使用Unicode來進(jìn)行編碼,類型統(tǒng)一為str,所以不再需要在中文前面加u來使中文字符變?yōu)閁nicode這種寫法。而且所有py3的腳本默認(rèn)都是utf8來編碼的,所以我們也不需要在腳本開頭指定coding:xxxx了。打印顯示的時(shí)候也會(huì)方便很多,由于是字符串都是Unicode格式,所以不管在命令行中還是pycharm中,都會(huì)正常顯示而不會(huì)出現(xiàn)亂碼。
參考
https://docs.python.org/2.7/howto/unicode.html#the-unicode-type
https://zhuanlan.zhihu.com/p/74613584