首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用python子进程在windows shell中包装(Vivado) CLI

如何使用python子进程在windows shell中包装(Vivado) CLI
EN

Stack Overflow用户
提问于 2019-11-05 17:15:03
回答 1查看 831关注 0票数 0

一些背景: Vivado有一个CLI,可以通过windows提示符使用

C:/path_to_vivado/bin/vivado -mode tcl

它静默地调用几个.bat文件,并设置几个环境变量,直到以下内容:CLI Vivado

因此,基本上在这一点上,您有一个tcl解释器,它提供vivado对象、命令、接口等。

(例如lindex [get_parts] 0 生产这个)

目标:我想要的是使用python包装它。我已经有了一些有用的东西,但我想要更多我不知道如何实现的东西。

我想要的是这样的东西

代码:

代码语言:javascript
运行
复制
import subprocess
from subprocess import PIPE, STDOUT
shl_cmd = r"C:/Xilinx/Vivado/2019.1/bin/vivado -mode tcl"
proc = subprocess.Popen(shl_cmd, shell=True ,stdin = PIPE, stdout = PIPE,  stderr = STDOUT)

tcl_cmd =b'lindex [get_parts] 0\n'
proc.stdin.write(tcl_cmd)
proc.stdin.flush()

#I know this "read all" is blocking but for now it is fine
while(1):                
        out = p.read(1)
        print(out.decode(),end='')

所需的输出(如果我在提示符中手动输入命令而不是使用python),这基本上就是它所显示的输出:

代码语言:javascript
运行
复制
****** Vivado v2018.3 (64-bit)
  **** SW Build 2405991 on Thu Dec  6 23:38:27 MST 2018
  **** IP Build 2404404 on Fri Dec  7 01:43:56 MST 2018
    ** Copyright 1986-2018 Xilinx, Inc. All Rights Reserved.

Vivado% lindex [get_parts] 0
xc7vx485tffg1157-1
Vivado%

但我拥有的是什么(stdout是空的,程序块)。

无论如何,如果在前面的代码中,tcl_cmd是tcl_cmd =b'puts [lindex [get_parts] 0]\n',那么我有输出:

代码语言:javascript
运行
复制
****** Vivado v2019.1 (64-bit)
  **** SW Build 2552052 on Fri May 24 14:49:42 MDT 2019
  **** IP Build 2548770 on Fri May 24 18:01:18 MDT 2019
    ** Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.

xc7vx485tffg1157-1

注意:可能在发生其他事情之前,报头不会被刷新到std输出,所以这就是为什么在puts指令之前没有显示它的原因。在我使用python收听的地方,我可以只阅读我使用puts解释发送的内容,但我不知道为什么。

更多的实验:

实验1:

代码语言:javascript
运行
复制
C:\Users\Corrado>vivado -mode tcl > filelog.txt
lindex [get_parts] 0
puts hello_world
exit

filelog.txt内容是:

代码语言:javascript
运行
复制
****** Vivado v2018.3 (64-bit)
  **** SW Build 2405991 on Thu Dec  6 23:38:27 MST 2018
  **** IP Build 2404404 on Fri Dec  7 01:43:56 MST 2018
    ** Copyright 1986-2018 Xilinx, Inc. All Rights Reserved.

Vivado% xc7vx485tffg1157-1
Vivado% hello_world
Vivado% exit
INFO: [Common 17-206] Exiting Vivado at Tue Nov  5 17:49:52 2019...

但对于代码:

代码语言:javascript
运行
复制
proc = subprocess.Popen(r"C:/Xilinx/Vivado/2019.1/bin/vivado -mode tcl > filelog.txt",shell=True ,stdin = PIPE, stdout=PIPE, stderr=STDOUT )
proc.stdin.write(b'lindex [get_parts] 0\n')
proc.stdin.flush()
proc.stdin.write(b'puts hello\n')
proc.stdin.flush()
proc.stdin.write(b'exit\n')
proc.stdin.flush()

logfile.txt是:

代码语言:javascript
运行
复制
****** Vivado v2019.1 (64-bit)
  **** SW Build 2552052 on Fri May 24 14:49:42 MDT 2019
  **** IP Build 2548770 on Fri May 24 18:01:18 MDT 2019
    ** Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.

hello
exit
INFO: [Common 17-206] Exiting Vivado at Tue Nov  5 17:54:32 2019...

请注意,显示exit可能是因为它不是tcl命令,默认情况下,unkown命令由应用程序管理,将它们发送到shell (我想我对此并不确定)

因此,看来来自的调用和使用子进程的调用会产生不同的行为,即使我希望它们是相同的。

我也试着使用pexpect,但没有成功,结果也差不多。

我不太关心显示Vivado%提示符(即使这会很好),但我希望在终端中打印一份准确的内容副本,即使在使用python的CLI时也是如此。(例如,将其打印到内部GUI中)

对不起,如果我有点长篇大论,但我想说清楚,我可以。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58716341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档