gpt4 book ai didi

python - 子进程python读取输出

转载 作者:行者123 更新时间:2023-12-01 09:04:31 30 4
gpt4 key购买 nike

我正在尝试使用 python 中的子进程运行命令,并尝试读取它的输出并将其复制到文件中。我的代码是:

    command = "%s -sK:\\run_one_test.csh %s %s" % (PATH, file, VERSION)
p = subprocess.Popen(command,stdout=subprocess.PIPE)

text = p.communicate()[0]
return_code = p.returncode




with open("%s/%s%s" % (LOG_DIR, file, LOG_EXT), "w") as f:


f.writelines([l.decode for l in text.split('\n')])

f.close()

但是当我使用分割线时,我收到错误消息:

    f.writelines([l.decode for l in text.split('\n')])
TypeError: a bytes-like object is required, not 'str'

为什么会发生这种情况?我用的是解码。另外,这是使用“\n”分割代码行的正确方法吗?谢谢。

最佳答案

textsubprocess.Popen 的结果,在 python 3 中,这是一个 bytes 对象。您不能使用字符串拆分它(text.split(b"\n") 可以,但您的代码中还有更多问题,所以忘记它吧)。

那么,您就不会调用解码(缺少括号)。在 text 上调用 decode 可以工作:text.decode()

现在使用 split('\n'),您将删除行尾,这样就无法正常工作(单行文件,哎呀)。你需要:

f.writelines(text.decode().splitlines(True))

(True 参数告诉函数保留行尾字符)

但是毕竟为什么要拆分再次写入行?,只需将文件转储时写入文件,作为字节,而不进行后期处理:

with open("%s/%s%s" % (LOG_DIR, file, LOG_EXT), "wb") as f:
f.write(text)

但是为什么要存储输出并将其写回文件呢?只需将文件句柄传递给 subprocess.call:

with open("%s/%s%s" % (LOG_DIR, file, LOG_EXT), "wb") as f:
retcode = subprocess.call(command,stdout=f)

或者如果命令返回码不为 0,则强制异常:

   subprocess.check_call(command,stdout=f)

因此,根据您想要对线条进行后处理、对缓冲区进行后处理还是根本不进行后处理,您可以选择上述 3 种(可能已修改)解决方案之一。

旁注:不要将命令组成为字符串,只需传递参数即可:

command = "%s -sK:\\run_one_test.csh %s %s" % (PATH, file, VERSION)

变成:

command = [PATH,"-sK:\\run_one_test.csh",file,VERSION]

(作为奖励,如果需要,会自动处理报价)

关于python - 子进程python读取输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52172390/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com