gpt4 book ai didi

python - 我可以对当前正在写入的文件使用 fdpexpect 吗?

转载 作者:行者123 更新时间:2023-12-01 05:02:32 25 4
gpt4 key购买 nike

我正在尝试等待一些文本写入 Python 中的实时日志文件。

fdpexect 似乎是正确的选择,但它不会等待。一旦到达文件末尾,它就会终止。

我想知道 fdpexpect 是否不支持此功能,我需要解决它吗?

我的代码基本上是这样的:

创建生成对象:

# we're not using pexpect.spawn because we want
# all the output to be written to the logfile in real time,
# which spawn doesn't seem to support.

p = subprocess.Popen(command,
shell=shell,
stdout=spawnedLog.getFileObj(),
stderr=subprocess.STDOUT)
# give fdspawn the same file object we gave Popen
return (p, pexpect.fdpexpect.fdspawn(spawnedLog.getFileObj()))

等待某事:

pexpectObj.expect('something')

这基本上会在“something”事件发生并出现 EOF 错误之前立即退出。

最佳答案

fdpexpect 不适用于普通文件。 pexpect 将始终从文件对象中读取数据,直到到达 EOF - 对于管道和套接字,直到连接实际关闭时才会发生这种情况,但对于普通文件,一旦整个连接结束,这种情况就会发生。文件已被读取。它无法知道该文件正在被另一个进程主动写入。

您可以通过使用 os.pipe 创建管道来解决此问题,然后实现您自己的 tee 功能来编写以下内容的 stdout除了日志文件之外,您对该管道的处理。这是一个似乎有效的小玩具示例:

from subprocess import Popen, PIPE, STDOUT
from threading import Thread
import os
import pexpect.fdpexpect

# tee and teed_call are based on http://stackoverflow.com/a/4985080/2073595

def tee(infile, *files):
"""Print `infile` to `files` in a separate thread."""
def fanout(infile, *files):
for line in iter(infile.readline, ''):
for f in files:
f.write(line)
infile.close()
t = Thread(target=fanout, args=(infile,)+files)
t.daemon = True
t.start()
return t

def teed_call(cmd_args, files, **kwargs):
p = Popen(cmd_args,
stdout=PIPE,
stderr=STDOUT,
**kwargs)
threads = []
threads.append(tee(p.stdout, *files))
return (threads, p)

with open("log.txt", 'w') as logf:
# Create pipes for unbuffered reading and writing
rpipe, wpipe = os.pipe()
rpipe = os.fdopen(rpipe, 'r', 0)
wpipe = os.fdopen(wpipe, 'w', 0)

# Have pexpect read from the readable end of the pipe
pobj = pexpect.fdpexpect.fdspawn(rpipe)

# Call some script, and tee output to our log file and
# the writable end of the pipe.
threads, p = teed_call(["./myscript.sh"], [wpipe, logf])

# myscript.sh will print 'hey'
pobj.expect("hey")

# orderly shutdown/cleanup
for t in threads: t.join()
p.wait()
rpipe.close()
wpipe.close()

关于python - 我可以对当前正在写入的文件使用 fdpexpect 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25769522/

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