在python中使用subprocess运行utf-8编码的windowsbatch file

当试图运行使用utf-8编码的Windowsbatch file时,使用Windows 7下的Python 2.7,batch file的第一个命令无法识别(请参阅示例)。

最有可能的是,被解释为字符。 我如何让底层的shell正确运行batch file?

所调用的batch file来自第三方。 这里是一个简单的python脚本,它重现了这个问题:

import codecs import subprocess content = "@echo off" with codecs.open('test_utf8.bat', 'w', 'utf-8-sig') as f: f.write(content) f.close() with open('test_ansi.bat', 'w') as f: f.write(content) f.close() print "Calling test_ansi.bat" subprocess.call('test_ansi.bat', shell=True) print "Calling test_utf8.bat" subprocess.call('test_utf8.bat', shell=True) print "Done" 

运行脚本将提供以下输出

 t:\tmp\test>python test.py Calling test_ansi.bat Calling test_utf8.bat t:\tmp\test>´╗┐@echo off '´╗┐@echo' is not recognized as an internal or external command, operable program or batch file. Done t:\tmp\test> 

注意, shell参数似乎没有任何作用。

Solutions Collecting From Web of "在python中使用subprocess运行utf-8编码的windowsbatch file"

好 。 我会让你用你的理由来使用python来创建批处理文件,并在外部运行这些文件,而不是在Python中执行 – 也是你的理由,要求utf-8批处理,而不是你的本地编码Windows或者你的DOS(因为两者都不一样)。

这里是:编码为“utf-8”,而不是“utf-8-sig”。 后者不是一个官方的变体,而是一个预先标记字节(BOM)的变体,这使得文件在Windows记事本中可以打开:“”“提高了检测UTF-8编码的可靠性,微软发明了一种变体对于记事本程序,UTF-8(即Python 2.5称为“utf-8-sig”):在将任何Unicode字符写入文件之前,UTF-8编码BOM(看起来像字节序列:0xef ,0xbb,0xbf)被写入,因为任何charmap编码的文件都是以这些字节值“”“开始的( http://docs.python.org/2/library/codecs.html )各种其他应用程序(包括,如你所见,微软的cmd )。

简而言之:编码为“utf-8”。 如果你想编辑窗口中的文件,生成后使用编辑器,而不是记事本,从Windows 3.0天以来大多保持不变。 (我想知道现在是否可以打开大于64kB的文件)