我习惯于在我的python脚本中逐个子进程.Popen启动命令。大多数脚本如下:Popen(shlex(cmd), stdin=PIPE, stdout=PIPE, sterr=STDOUT)
现在我有一个命令接收到“CTRL-C”进入“命令行界面”模式以接受调试指令的情况。似乎Popen不支持像stdin=input
那样将标准输入传递给参数stdin
。我知道我可以使用使用标准输入/输出作为其输入/输出的os.system(cmd),但这不是我的解决方案。
好让人给我看另一个解决方案?先谢了。
2条答案
按热度按时间o7jaxewo1#
你可能想发送中断信号。使用
os.kill
或kill -SIG $SUBPROCESS_PID
作为子进程的进程ID。这与使用Ctrl+C相同,只是直接向子进程发送信号。为此,您需要知道所产生的子进程的PID。
此外,您还需要处理要打印调试信息的命令中的信号
拿到PID后,你就可以
cat ./pid | kill -SIGINT
添加到进程,或者从python:rdlzhqv92#
ctrl+c
是一个signal,信号不会传递到标准输入(默认情况下),而是发送到连接到终端的所有进程,每个进程负责处理它(因此父进程和子进程都必须处理KeyboardInterrupt
异常或注册signal handler),从父进程向子进程转发stdin不会改变这一点。如果您仍然希望转发stdin(它只转发写入控制台的文本),那么您可以传递
stdin=sys.stdin
而不是PIPE
。**编辑:**要在ctrl+c下进入调试模式,父级必须注册一个信号处理程序以跳过
SIGINT
,子级必须注册另一个信号处理程序到pause on ctrl+c,并且子级应该有stdin=sys.stdin, stdout=sys.stdout
以打印和从控制台读取。