在Windows中使用Python调用命令行中文字符失败

1 投票
2 回答
1849 浏览
提问于 2025-04-18 12:48

在Windows系统下使用Python时,在py脚本(test.py)中,调用os.system或subprocess.Popen来执行命令行指令时会失败,但在命令行窗口(windows->cmd.exe)中执行却没有问题。以下是一些额外的信息:

  • 1. 命令行窗口的编码是'cp936',属于'gbk'编码。
  • 2. 我已经用Notepad++把test.py文件的编码转换成了utf-8。
  • 3. 我尝试过使用.decode('gbk')、.encode('gbk')、.decode('utf-8')和.encode('utf-8')。
  • 4. 我不知道为什么会这样。

错误信息:

    C:\Python27\python.exe E:/XtTradeClient/test.py
    File "E:/XtTradeClient/test.py", line 5 
    SyntaxError: Non-ASCII character '\xba' in file E:/XtTradeClient/test.py on line 5,but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

    Process finished with exit code 1

    -------------------------------------------------------------------------------
    # encoding='utf-8'
    import os

    if __name__ == "__main__":
        info = '汉字'
        cmd = 'echo ' + info
        if 0 != os.system(cmd):
            raise Exception('failed to call 'echo in command')
    -------------------------------------------------------------------------------

2 个回答

0

你的编码魔法注释写得不对。把它改成 #-*- coding=utf-8 -*-

想了解更多信息,可以查看 pep 0263

1

这个错误是因为缺少编码注释。看起来你试着添加了一个,但格式不对,所以没有被识别。你可以试试:

# encoding: utf-8

接下来的问题可能是终端期待的编码。如果你的源代码是以UTF-8格式保存的,那么里面的(字节)字符串就是UTF-8编码的,并且是以这种方式传递给os.system()的。你可能需要重新编码,以便应用程序能够正确显示这些字节为字符。也就是说:首先要从UTF-8解码成unicode,然后再从unicode转成终端编码的str。通过使用unicode字面量,可以避免显式解码,至少对于那些包含ASCII范围外字符的(字节)字符串来说是这样。

# encoding: utf-8
import os


def main():
    info = u'汉字'
    cmd = 'echo ' + info
    if not os.system(cmd.encode('gbk')):
        raise Exception('failed to call `echo` command')


if __name__ == '__main__':
    main()

撰写回答