python-3.x - 如何与未关闭/完成的子进程交互?
问题描述
您好我正在尝试编写一个使用 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 退出并出现错误,本质上是关闭标准输出。
我想在我的脚本中做的是:
- 启动 J-Link 程序
- 从程序中获取初始输出(这样我就可以解析它并确定脚本是否应该继续)
- 向 J-Link 程序发出命令
- 获取任何响应,解析它们并在我的脚本中使用它
- 脚本完成后发出 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。所以已经扔掉了上面代码的子进程。
解决方案
推荐阅读
- c++ - C++ 可变大小对象可能未初始化
- javascript - 将枚举数转换为字符串
- django - Django 中的软删除
- ios - 为什么覆盖一个函数并且除了调用基类实现什么都不做会返回与不覆盖它不同的结果?
- c++ - 切换到子线程时,gdb 抱怨“没有可用的源”
- powerbi - 如何在 Power BI 中使用真实数据库并使其动态刷新?
- python-2.7 - 使用地理空间数据类型作为 Apache Beam 的输入
- swift - 枚举模式匹配作为函数调用的参数
- javascript - 如何提取一个数组,其中该数组的键将作为 javascript 中的变量?
- javascript - 在从获取的图像中创建元素上设置 src 属性