python 3使用额外字符打印

时间:2012-03-19 13:43:46

标签: python python-3.x

我有以下部分将 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'是额外的,不要指望它们在那里。

2 个答案:

答案 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)