问题描述
使用python2.7执行os.popen()打开系统带中文参数命令的时候报了参数不合法,但是把命令打印出来复制到cmd里面是可以执行的。而且把中文换成英文也不会报错。
仿照问题做了个例子复现如下:
先创建几个文件:
image.png
然后写一段代码进行复制操作:
# -*- coding: utf-8 -*-
import os
cmd = 'copy ' + ' 测试 '+' /a test' #系统找不到指定文件
# cmd = 'copy ' + ' adf '+' /a test' #正常拷贝
print cmd
finishInfo = os.popen(cmd).read().decode('gbk')
print finishInfo
解决办法
1.换python3执行(有条件的话)
2.将文件首行的编码格式改成gbk
3.使用decode
finishInfo = os.popen(cmd.decode('utf-8').encode('gbk')).read().decode('gbk')
先转成unicode,再转成gbk。
- 先使用u前缀将命令声明为unicode再encode成gbk。
原因探究
这里涉及到三个地方的编码,python脚本,运行环境也就是pycharm,cmd。
pycharm里的编码设置,参考https://www.jetbrains.com/help/pycharm/settings-file-encodings.html
cmd由于是win10系统,默认是gbk编码(也可以设置)。
py2的里默认是用ascii码编码脚本,在开头加上 类似# -- coding: utf-8 --之后,字符串会按照声明的字符编码格式来进行编码。如果不加任何操作这里通过popen管道传过去的就是utf-8的编码,这时到了gbk编码的cmd中就会出现乱码从而找不到文件。
py3中,所有的字符串不再受系统环境编码的影响,统一使用Unicode来进行编码,类型统一为str,所以不再需要在中文前面加u来使中文字符变为Unicode这种写法。而且所有py3的脚本默认都是utf8来编码的,所以我们也不需要在脚本开头指定coding:xxxx了。打印显示的时候也会方便很多,由于是字符串都是Unicode格式,所以不管在命令行中还是pycharm中,都会正常显示而不会出现乱码。
参考
https://docs.python.org/2.7/howto/unicode.html#the-unicode-type
https://zhuanlan.zhihu.com/p/74613584
网友评论