Python 3.x 如何与未关闭/完成的子流程交互?
嗨,我正在尝试编写一个脚本,使用塞格的J-Link工具。运行J-Link工具时,它会向用户显示提示,然后可以向其发出命令以执行任务。以下是从命令提示符下运行时得到的结果:Python 3.x 如何与未关闭/完成的子流程交互?,python-3.x,windows-10,subprocess,pipe,Python 3.x,Windows 10,Subprocess,Pipe,嗨,我正在尝试编写一个脚本,使用塞格的J-Link工具。运行J-Link工具时,它会向用户显示提示,然后可以向其发出命令以执行任务。以下是从命令提示符下运行时得到的结果: C:\Program Files (x86)\SEGGER\JLink>jlink SEGGER J-Link Commander V6.56b (Compiled Dec 6 2019 15:00:15) DLL version V6.56b, compiled Dec 6 2019 14:58:46 Conne
C:\Program Files (x86)\SEGGER\JLink>jlink
SEGGER J-Link Commander V6.56b (Compiled Dec 6 2019 15:00:15)
DLL version V6.56b, compiled Dec 6 2019 14:58:46
Connecting to J-Link via USB...O.K.
Firmware: Energy Micro EFM32 compiled Apr 20 2016 12:17:23
Hardware version: V1.00
S/N: 440082037
License(s): RDI
VTref=3.297V
Type "connect" to establish a target connection, '?' for help
J-Link>
当我运行以下代码时:
导入子流程
process=subprocess.Popen('C:\\Program Files(x86)\\SEGGER\JLink\\JLink.exe-rhouse',stdout=subprocess.PIPE,universal\u newlines=True)
打印(process.stdout.read())
我得到以下输出
SEGGER J-Link Commander V6.56b (Compiled Dec 6 2019 15:00:15)
DLL version V6.56b, compiled Dec 6 2019 14:58:46
Unknown command line option -nonsense.
但是,如果我删除了无意义的选项,进程将挂起。这与无意义的选项J-Link退出时出错一样有意义,本质上是关闭标准输出
我想在脚本中做的是:
从线程导入线程
def读卡器(f,缓冲器):
尽管如此:
line=f.readline()
如果行:
buffer.append(行)
其他:
打破
进程=子进程.Popen(“C:\\Program Files(x86)\\SEGGER\\JLink\\JLink.exe-设备EFM32G380F1024-如果SWD-速度14000-自动连接1”,标准输出=子进程.PIPE)
时间。睡眠(2)
linebuffer=[]
t=Thread(target=reader,args=(process.stdout,linebuffer))
t、 daemon=True
t、 开始()
尽管如此:
如果是linebuffer:
打印(linebuffer.pop(0))
其他:
打印(“此处无任何内容”)
时间。睡眠(1)
我收到一连串“这里什么都没有”的信息。如果我将命令替换为不返回的简单ping,我将得到预期的ping结果。似乎Jlink不是在玩球
process=subprocess.Popen(“C:\\windows\system32\ping.exe 127.0.0.1-t”,stdout=subprocess.PIPE)
编辑2:
过去我试过,但没有成功。因此,现在我对JLink有了更多的经验,请再试一次
发现我需要调用set_tif(1)将接口从JTAG的默认设置设置为SWD。因此,我们抛弃了上面的子流程代码。您不需要只写输入吗?使用
stdin=subprocess.PIPE
然后向输入写入命令。@Tadhgmald Jensen,是的,我需要这样做,但首先我想捕获初始输出“SEGGER J-Link Commander V6.56b(编译于2019年12月6日15:00:15)。目前,在我尝试发送某些内容之前,它会被阻止。.stdout.read()
将被阻止,直到进程终止,因为这已经有了答案。@Tadhgmandald Jensen是的,我想是的,我不确定我是这样想的。我看过你提到的帖子,但我认为这是两个复杂的问题。我现在尝试了jsf应答,只是简单地替换了命令。未阻止,但id未获得任何输出。我只想在进程结束之前访问标准输出缓冲区…嗯,。。。。我似乎得到了类似的结果。。。我想知道在进入程序之前,输出是否被捕获在某个缓冲区中,当程序结束时,它会刷新该缓冲区。我真的不知道如何在这种情况下提供帮助抱歉。