我有以下部分将 ant 构建信息打印到文件中。
rsltFile = open('buildLog.txt', 'w')
p = subprocess.Popen('call ant compile', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout.readlines():
rsltFile.write("%s\n" % line)
print(line)
retval = p.wait()
它在 python 2.6 中运行良好,但它为 python 3.2 中的每一行打印出一些额外的字符,如下所示:
b'Buildfile: C:\\workspace\\VCT2400_Service\\ServiceApplication\\build.xml\r\n'
b'\r\n'
b'init:\r\n'
b'\r\n'
b'clean:\r\n'
b' [mkdir] Created dir: C:\\workspace\\VCT2400_Service\\ServiceApplication\\classes\r\n'
b'\r\n'
b'compile:\r\n'
b' [javac] Compiling 492 source files to C:\\workspace\\VCT2400_Service\\ServiceApplication\\classes\r\n'
那些 b'和 \ r \ n'是额外的,不要指望它们在那里。
答案 0 :(得分:3)
以文本模式打开的文件希望将字符串写入其中。您从readlines()
获得字节对象,这些对象通过格式%
运算符转换为字符串表示。
以二进制模式打开文件并直接在那里转储行:
rsltFile = open('buildLog.txt', 'wb')
...
rsltFile.write(line + b'\n')
...或者,将子进程输出解释为字符串:
linestr = line.decode('utf8')
P.S。看起来不需要添加'\ n',每个line
已经以换行符结束。
答案 1 :(得分:1)
或者尝试将此universal_newlines=True
添加到Popen类构造函数中。
p = subprocess.Popen('call ant compile', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,universal_newlines=True)