python - 捕获和处理流程的输出
问题描述
我想在python中制作包装器,它将捕获另一个python程序的输出,然后将该输出发送到多个地方,如记录器和telnet服务器,但我被困在产生这些进程和它的通信
我已经尝试使用子进程来运行和捕获但是我遇到了问题,它仅在进程退出时才返回输出,这对于大多数程序处于基本状态的无限循环来说是不可接受的,因此例如我有这两个脚本
i = 0
running = True
while running:
print(i)
sleep(10) #simulate program idling
if i == 20:
running = False
else:
i += 1
print("Exit reached")
第二个应该是这样的
program = "first_script.py"
program.start() #non blocking?
while program.exist:
print(program.get_output())
sleep(5)
所以因为它会每 5 秒请求一次输出,所以它应该得到 2 倍的相同输出,但我不确定是否应该考虑获取一些事件监听函数,它将下一行添加到缓冲区或类似上面的示例每次从某个内部缓冲区询问整个输出时都应该收到
我的问题是在捕获此输出并将其发送到另一个进程时我应该使用什么方法以及如何使用
解决方案
你可以这样做,它subprocess
在我的测试中使用并且至少可以在 Windows 上运行(我认为它也可以在其他操作系统上运行):
import subprocess
import sys
# Execute another Python scipt as a separate process and echo its output.
kwargs = dict(stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
universal_newlines=True)
args = [sys.executable, 'second_script.py']
with subprocess.Popen(args, **kwargs).stdout as output:
for line in output:
print(line, end='') # Process the output...
推荐阅读
- c - C - 嵌套链表
- typescript - 打字稿否定无效:强制函数返回不无效
- webpack - 如何防止动态导入复制捆绑包?
- colors - 避免在 cg 着色器中出现循环瓶颈
- python-3.x - 使用 Python 和 Python-Requests 模拟用户登录到 .net 表单
- c# - 将范围添加到同一命令/行中的新对象列表
- android - com/google/android/exoplayer2/upstream/DefaultAllocator 的 NoSuchMethodError
- html - 使链接适合导航栏
- python - Lambda 上的 FFMPEG - 没有这样的过滤器:覆盖
- python - 如何优化和改造我的文本转换器(工作速度很慢)