特定程序的输出无法在 Windows 上被 TCL 捕获,而 Linux 版本则运行良好

问题描述 投票:0回答:1

这不是我第一次使用 TCL 捕获 TCL 执行的程序的输出。我做了好几次了。

简单的方法是将 exec 命令的结果存储在 tcl 变量中,但如果程序的输出很长或者程序在每次显示之间等待很长时间,那么这不是好方法。

所以我使用“open”命令使用其他两种方法。但它们都不适用于 questa-lint windows 可执行文件(它适用于 Linux 可执行文件)。 :

方法1(不带管道打开):

set appli [open "|toto.exe 2>@ $logfile" r]
fconfigure $appli -blocking false -buffering line -encoding utf-8

update

set update 0
set nb_ligne_vide 0

# Ecriture du rapport
set boucle 1
while {$boucle} {

    # Lecture ligne
    gets $appli line

    if {[eof $appli] == 1} {set boucle 0}
    # Si ligne complète...
    if {[fblocked $appli] != 1} {

        if { $line == "" } {
            incr nb_ligne_vide
        }

        if {$line != "" | ($nb_ligne_vide > 1)  } {
            puts $line
            incr update
            set nb_ligne_vide 0
        }
    }  else {
        after 10
        incr update
    }

    if { $update > 50 } {
        set update 0
        update
    }
}
close $appli

方法2(用管子打开)

set appli [open "|toto.exe 2>@ $logfile" r+]
fconfigure $appli -blocking false -buffering line -encoding utf-8

fileevent $appli readable [list pipe_questalint $appli]

proc pipe_questalint { appli } {
    global done etat
    if { [eof $appli] } {
        close $appli
        set done 1
    } else {

        if {[gets $appli line] >= 0} {
            puts "TEST: $line"
        }
    }
}
vwait done

使用这两种方法,我在程序执行期间没有显示任何行。即使在 TCL 程序执行期间,会显示一个 Windows 命令行,其中显示 TCL 执行的工具生成的所有输出。

如果我在没有 tcl 的情况下启动该工具,但在 Windows cmd.exe 中使用命令行,我可以看到该工具的输出显示在与我用来启动该程序的窗口相同的窗口中。

method2(open + pipeline)在 Linux 下使用同一工具的 Linux 版本运行良好。

方法 1 和 2 在 Linux 和 Windows 下也可以与其他工具一起使用。我不太清楚这两种方法之间的区别,即使我猜测管道方法可能会更好地优化,我也不知道哪种方法更好。

我还测试了这些代码,没有错误重定向,我也遇到了同样的问题。这是我第一次遇到这种问题,但我使用了超过 10 个来自不同编辑器的工具成功地解决了这个问题。

非常感谢您的帮助

pipe tcl
1个回答
0
投票

Windows版本的程序可能会直接写入控制台;有一个完整独立的 API 可以做到这一点。 (这是 Tcl 知道的一个技巧,并在它认为合适时使用它自己。)Linux 上的等效方法是运行时决定通过打开

/dev/tty
来替换 stdin 和 stdout。很难确定这种情况是否正在发生;幕后有很多复杂性。

exec
真正能做的就是制作管道并将程序连接到它们上。它不能强制程序“使用”这些管道。 您可以尝试获取 Expect-for-Windows 并使用它来运行子进程...这可能有效。

© www.soinside.com 2019 - 2024. All rights reserved.