我编译了一个连接到软件无线电的Windows可执行文件,并读出其寄存器中的值。当我在命令提示符下执行它时,它返回以下输出
我的硬件通过USB连接到COM4,当我将这些作为参数传递时,我得到以下屏幕,我可以选择其他ID与其他无线电的距离(100是主机无线电.101,102 103和104是其他无线电)或者可以通过输入' q'退出应用程序。
如果我输入了要测试的无线电的ID,我会得到测距信息,这个过程一直持续到我退出键入' q'
现在,我试着写一个python脚本,我可以调用这个可执行文件,获取值并存储它们以供进一步处理。我已经读过其他主题,这可以通过库“子流程”来实现。我的代码片段如下
#!/usr/bin/env python
import subprocess
import time
#subprocess.Popen([r"C:\Users\Raja\Documents\SUMO_Final\rcmSampleApp.exe"])
p = subprocess.Popen("C:/Users/Raja/Documents/SUMO_Final/rcmSampleApp.exe -u COM4", shell = True, stdin = subprocess.PIPE)
p.stdin.write('104')
time.sleep(5)
p.stdin.write('q')
p.kill()
当我在.py文件中执行此操作时,.exe会无限循环,如下所示
论坛中的一些答案建议更改shell = False并在杀死它之前终止该过程,但对我来说并不清楚。有人可以帮忙吗?
干杯
答案 0 :(得分:1)
flush
管道(并包含换行符以模拟用户输入,使用Enter键按下,假设程序需要),以及close
管道,当您完成时。避免shell=True
通常也是一个好主意,因为它引入了包含命令的其他层(在除此之外的情况下,会增加安全性和稳定性问题)。尝试:
#!/usr/bin/env python
import subprocess
import time
# Use list form of command to avoid shell=True, and raw string to allow
# safe use of "normal" looking Windows-style path
# Include universal_newlines=True automatic str decoding in Py3; it might
# fix newlines on Py2 as well, but if not, you'll need to explicitly send
# \r\n instead of just \n to match OS conventions (or use os.linesep to autoselect)
p = subprocess.Popen([r"C:\Users\Raja\Documents\SUMO_Final\rcmSampleApp.exe", "-u", "COM4"],
stdin=subprocess.PIPE, universal_newlines=True)
p.stdin.write('104\n') # Include newline that manual entry includes
p.stdin.flush() # Ensure write not buffered
time.sleep(5)
p.stdin.write('q\n') # Include newline
p.stdin.close() # Flush and close stdin, so program knows no more input coming
p.kill() # Depending on program, p.join() might be enough
假设p.join()
有效,您可以用以下内容替换最后三行(write
,close
和kill
/ join
):
p.communicate('q\n')
将隐式执行所有三个任务。
答案 1 :(得分:1)
当您以交互方式使用程序时,我假设您键入 101 返回 ,然后 q 返回
当你从Python开始时,你必须使用\n
模拟 Return ,你应该等待程序结束而不是杀死它:
p.stdin.write('104\n')
time.sleep(5)
p.stdin.write('q\n')
p.wait()
但是,由于您只传递已知输出,如果您只想阅读并处理输出,最好选择使用communicate
:
out, err = p.communicate('104\nq\n')