Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python中的子进程运行utf-8编码的windows批处理文件_Python_Windows_Encoding_Batch File_Subprocess - Fatal编程技术网

使用python中的子进程运行utf-8编码的windows批处理文件

使用python中的子进程运行utf-8编码的windows批处理文件,python,windows,encoding,batch-file,subprocess,Python,Windows,Encoding,Batch File,Subprocess,当尝试在windows 7下使用Python 2.7运行使用utf-8编码的windows批处理文件时,批处理文件的第一个命令无法识别(请参见示例) 最可能的情况是,bom表被解释为字符。如何使底层shell正确运行批处理文件 名为的批处理文件来自第三方。下面是一个简单的python脚本,它重新创建了问题: import codecs import subprocess content = "@echo off" with codecs.open('test_utf8.bat', 'w', '

当尝试在windows 7下使用Python 2.7运行使用utf-8编码的windows批处理文件时,批处理文件的第一个命令无法识别(请参见示例)

最可能的情况是,bom表被解释为字符。如何使底层shell正确运行批处理文件

名为的批处理文件来自第三方。下面是一个简单的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
参数似乎没有任何效果。

Ok。我将告诉您使用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编码的文件以这些字节值“”()开头,但对于其他各种应用程序来说都是垃圾(如您所见,包括微软的
cmd

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

好的,谢谢。它解决了我的测试用例。结果表明,它在从命令行运行时产生了与我的其他外部脚本相同的错误。