python - 打开一个进程并捕获标准输出并发送自定义按键
问题描述
我有这个 python 脚本(带ncurses
):
#! /usr/bin/python3
import sys,os
import curses
def draw_menu(stdscr):
k = 0
while (k != ord('q')):
stdscr.clear()
height, width = stdscr.getmaxyx()
stdscr.addstr(0, 0, "Last key is {}".format(k))
stdscr.refresh()
k = stdscr.getch()
def main():
curses.wrapper(draw_menu)
if __name__ == "__main__":
main()
这些是我最后一次尝试(结果不好)来捕获标准输出并发送按键:
这是与Popen
.
from subprocess import Popen, PIPE
#p = Popen('./test5.py', stdin=PIPE, stdout=PIPE, shell=True)
#p = Popen('./test5.py', shell=True)
p = Popen('./test2.py')
print(p.pid)
sleep(100)
p.stdin.write('a')
# p.stdin.close()
# p.stdout.close()
# p.wait()
这是其他的pexpect
:
import sys
import pexpect
child = pexpect.spawn('./test5.py', logfile=open("/tmp/file", "wb"))
child.logfile = open("/tmp/file", "wb")
child.expect(pexpect.EOF)
child.send('a')
child.send('q')
child.interact()
我试过了,xdotools
但我无法捕捉到标准输出。
是否有任何形式可以欺骗/欺骗可执行文件,因为它“相信”它正在正常运行?
解决方案
我发现解决方案是“非阻塞读取标准输出”。https://chase-seibert.github.io/blog/2012/11/16/python-subprocess-asynchronous-read-stdout.html和https://gist.github.com/sebclaeys/1232088中有几个解决方案.
我的问题代码解决方案:
import os
import fcntl
import subprocess
p = subprocess.Popen(['./test5.py'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
fd = p.stdout.fileno()
fl = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
p.stdout.read()
p.stdin.write(b'u')
p.stdin.flush()
p.stdout.read()
p.stdin.write(b'u')
p.stdin.flush()
p.stdout.read()
p.poll()
p.stdin.write(b'q')
p.stdin.flush()
p.poll()
推荐阅读
- python - 如何在python中使用正则表达式获取特定符号后的浮点值?
- python - Python 打字:TypedDict - TypedDict 实例和 TypedDict 类有什么区别?
- reactjs - msal-react TypeError:无法获取
- c# - AutoCAD 使用 ObjectARX 检查活动(等待)命令是否完成,然后使用 VB 或 C# 运行下一个命令
- excel - vba删除做而
- bash - Jmeter OS 进程采样器未在 bash 模式下执行
- r - 进行回归时如何存储 beta?
- cardano - 如何在 Cardano 节点中找到当前的 a0 参数
- sql - 如何在 SQL Server 中将 NVarchar 日期时间转换为日期时间格式?
- android - 反应原生的透明日期时间选择器