gpt4 book ai didi

windows - TCL : Execute a windows command line and see the "flow" of the application

转载 作者:可可西里 更新时间:2023-11-01 11:51:07 25 4
gpt4 key购买 nike

我试过下面的代码:

set my_cmd "|tracert google.com"

puts "Now executing the command '$my_cmd':\n"

set f [open $my_cmd "r"]

#process command output
while {[gets $f line] != -1} {
# print line
puts $line
}

close $f

它适用于 tracert 我看到程序逐行运行,但对于我的应用程序(在附图中运行的那个),它等待应用程序完成,然后才显示所有输出。也用“exec”尝试了几种方法,但没有成功。

它只有在我这样做时才有效: enter image description here

什么 tcl 代码可以让它工作?

最佳答案

当子进程写入管道(或文件)而不是终端时,通常输出会被缓冲;只有当输出累积到某个点(通常是 4kB)或者当输出 channel 关闭或程序退出时(这两种情况都会触发刷新剩余的所有内容),才会写入输出。如果程序的行为是慢慢地滴出几个字节,程序就好像挂了一样。它没有;只是您在等待程序发挥它的魔力。

为什么 tracert 没有这种行为?很简单:它要么在每一行之后显式刷新其内部缓冲区,要么根本不缓冲,只是直接写入字节。当一个程序产生大量输出时速度变慢(因为它最终会进行更多的系统调用)但当输出不多时,这首先并不是什么大问题。简而言之,tracert 不是您遇到问题的程序的好模型。

我从您的屏幕截图中注意到,真正的问题很可能出在缓冲其输出的 Python 程序上。 Stack Overflow 问题中描述了多种处理此问题的技术:Disable output buffering .我会先尝试设置环境变量,因为这在 Tcl 中很容易做到:

set ::env(PYTHONUNBUFFERED) yes

但是,一般还有其他方法可以从 Tcl 端解决这个问题。主要提到的是使用 Tcl 扩展,Expect .这会在幕后进行一些邪恶的操作系统黑客攻击,使其看起来好像程序正在以交互模式运行,从而触发不同的缓冲行为。

package require Expect

set my_cmd "tracert google.com"
puts "Now executing the command '$my_cmd':"

spawn {*}$my_cmd

#process command output
expect {
-re {([^\r\n]+)[\r\n]} { ### Match a whole line
set line $expect_out(1,string)
### This is where your code from inside your loop goes
puts $line
### Match the next line
exp_continue
}
eof { ### Special clause for End-Of-File; which is effectively empty
}
}

close

这是对 Expect 的非常简单的使用(它也可以代表您与子程序交互)但它是您程序的基本翻译。

关于windows - TCL : Execute a windows command line and see the "flow" of the application,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29417002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com