美文网首页程序员
python2.7 os.popen()执行带中文命令报错问题

python2.7 os.popen()执行带中文命令报错问题

作者: landscape_f117 | 来源:发表于2020-04-25 17:24 被阅读0次

    问题描述

    使用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。

    1. 先使用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

    相关文章

      网友评论

        本文标题:python2.7 os.popen()执行带中文命令报错问题

        本文链接:https://www.haomeiwen.com/subject/lrehwhtx.html