首页 > 解决方案 > 如何与未关闭/完成的子进程交互?

问题描述

您好我正在尝试编写一个使用 Segger 的 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>

当我运行以下代码时:

import subprocess
process = subprocess.Popen('C:\\Program Files (x86)\\SEGGER\JLink\\jlink.exe -nonsense', stdout=subprocess.PIPE, universal_newlines=True)
    print(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.

但是,如果我删除 -nonsense 选项,进程就会挂起。这是有道理的,因为 J-Link 退出并出现错误,本质上是关闭标准输出。

我想在我的脚本中做的是:

  1. 启动 J-Link 程序
  2. 从程序中获取初始输出(这样我就可以解析它并确定脚本是否应该继续)
  3. 向 J-Link 程序发出命令
  4. 获取任何响应,解析它们并在我的脚本中使用它
  5. 脚本完成后发出 qc 命令导致 J-Link 关闭。

我的子进程调用有什么问题导致进程挂起,或者我试图做的永远不会奏效,我还能尝试什么?

编辑:

使用此处找到的答案的修改版本https://stackoverflow.com/a/36477512/9791536

from threading import Thread 
def reader(f,buffer):
    while True:
        line=f.readline()
        if line:
            buffer.append(line)
        else:
            break

process = subprocess.Popen("C:\\Program Files (x86)\\SEGGER\\JLink\\jlink.exe -device EFM32GG380F1024 -if SWD -speed 14000 -autoconnect 1", stdout=subprocess.PIPE)
time.sleep(2)
linebuffer=[]
t=Thread(target=reader,args=(process.stdout,linebuffer))
t.daemon=True
t.start()

while True:
    if linebuffer:
        print(linebuffer.pop(0))
    else:
        print("nothing here")
        time.sleep(1)

我收到一连串“这里什么都没有”的消息。如果我用不返回的简单 ping 替换命令,我会得到预期的 ping 结果。好像Jlink不玩球了......

process = subprocess.Popen("C:\\windows\system32\ping.exe 127.0.0.1 -t", stdout=subprocess.PIPE)

编辑2:

过去我尝试过PyLink Module,但没​​有奏效。所以现在再试一次,我对 JLink 有了更多的经验。

发现我需要调用 set_tif(1) 将接口从默认的 JTAG 设置为 SWD。所以已经扔掉了上面代码的子进程。

标签: python-3.xwindows-10subprocesspipe

解决方案


推荐阅读