python2.7 os.popen()執(zhí)行帶中文命令報(bào)錯(cuò)問題

問題描述

使用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è)文件:


image.png

然后寫一段代碼進(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。

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 字符集和編碼簡(jiǎn)介 在編程中常??梢砸姷礁鞣N字符集和編碼,包括ASCII,MBCS,Unicode等字符集。確切的說...
    蘭山小亭閱讀 9,091評(píng)論 0 13
  • python編碼錯(cuò)誤和中文的亂碼問題,研究了整整兩天,查閱了很多資料,也走了一些彎路,我把經(jīng)驗(yàn)寫下,讓新手少走點(diǎn)彎...
    adminlzzs閱讀 3,599評(píng)論 0 4
  • 一. 什么是編碼 將明文轉(zhuǎn)換為計(jì)算機(jī)可以識(shí)別的的編碼文本稱為“編碼”, 反之從計(jì)算機(jī)可識(shí)別的編碼文本轉(zhuǎn)回明文為“解...
    Techml閱讀 4,950評(píng)論 0 3
  • 一、python程序編輯界面和運(yùn)行界面通常都是默認(rèn)unicode編碼字符串的,編輯界面則是ascii編碼的,也就是...
    木禾米粥閱讀 29,513評(píng)論 4 11
  • 2018.5.23 P134 晴 小悠今天的狀態(tài)不錯(cuò),中午就做了口算題卡,錯(cuò)了一個(gè)計(jì)算,比昨天好多...
    月出孤舟寒閱讀 863評(píng)論 3 10

友情鏈接更多精彩內(nèi)容