Python 3.x 如何与未关闭/完成的子流程交互?

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

嗨,我正在尝试编写一个脚本,使用塞格的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

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退出时出错一样有意义,本质上是关闭标准输出

我想在脚本中做的是:

  • 启动J-Link程序
  • 从程序中获取初始输出(这样我就可以解析它并确定脚本是否应该继续)
  • 向J-Link程序发出命令
  • 获取任何响应,解析它们并在我的脚本中使用它
  • 脚本完成后,发出qc命令,导致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未获得任何输出。我只想在进程结束之前访问标准输出缓冲区…嗯,。。。。我似乎得到了类似的结果。。。我想知道在进入程序之前,输出是否被捕获在某个缓冲区中,当程序结束时,它会刷新该缓冲区。我真的不知道如何在这种情况下提供帮助抱歉。