Как обернуть (Vivado) CLI в оболочку Windows, используя подпроцесс Python - PullRequest
0 голосов
/ 05 ноября 2019

Немного предыстории: В Vivado есть CLI, который можно вызвать из командной строки Windows, используя

C:/path_to_vivado/bin/vivado -mode tcl.

. Он молча вызывает несколько файлов .bat иустановите несколько переменных окружения до этого: CLI Vivado

Таким образом, на данный момент у вас есть интерпретатор tcl, который предлагает объекты, команды, интерфейсы vivado и т. д.

(например, lindex [get_parts] 0 произвести это )

Цель : я хочу обернуть его, используя python. У меня уже было что-то работающее, но я хочу чего-то большего, что я не знаю, как реализовать.

То, что я хотел бы иметь, это что-то вроде этого

Код:

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):

****** 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%

Но у меня ничего нет (стандартный вывод пустой ипрограммные блоки).

В любом случае, если в предыдущем коде tcl_cmd равен tcl_cmd =b'puts [lindex [get_parts] 0]\n', у меня есть вывод:

****** 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 до тех пор, покаиначе это так, вот почему оно не показывается до того, как помещает инструкцию. там, где я слушаю Python, я могу читать только то, что я отправляю с помощью expts, но я не знаю почему.

Некоторые эксперименты Подробнее:

Эксперимент 1:

C:\Users\Corrado>vivado -mode tcl > filelog.txt
lindex [get_parts] 0
puts hello_world
exit

И содержимое файла filelog.txt:

****** 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...

Но для кода:

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:

****** 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...

Обратите внимание, что выход отображается, вероятно, потому, что он не является командой tcl, и по умолчанию команда unkown управляется приложением, отправляющим их в оболочку (думаю, я в этом не уверен)

Похоже, что вызов из оболочки и использование подпроцесса приводят к другому поведению, даже если я ожидаю, что они будут одинаковыми.

Я тоже пытался использовать pexpect, но безуспех и почти с такими же результатами.

Мне не важно показывать приглашение Vivado% (даже если это было бы неплохо), но я хотел бы получить точную копию содержимого, напечатанного в терминале, когда я использую интерфейс командной строки изтам, даже когда я использую CLI из Python. (Например, чтобы распечатать его во внутреннем графическом интерфейсе)

Извините, если я был немного многословен, но я хотел быть более ясным, я могу.

...