【发布时间】:2018-08-20 14:24:01
【问题描述】:
我正在尝试将我的一个小型 python 脚本移植到 nim。核心是对 fzf 的调用:
fzf = subprocess.Popen(["fzf"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
stdout, stderr = fzf.communicate(some_data)
据我了解 fzf open /dev/tty 与用户进行交互并使用 stdin/stdout 与调用它的程序进行通信。对应的nim代码:
var p = startProcess(path_to_fzf)
var stream = p.inputStream()
stream.write(some_data)
stream.flush()
但在我的 nim 版本中,fzf TUI 没有出现。但是会读取终端的输入,因为根据我的输入选择了正确的项目。
我不知道为什么会这样。我想也许 nim 用startProcess 创建了一个 PTY,但/proc/sys/kernel/pty/nr 并没有增加,所以我认为情况并非如此。我尝试使用-d:useFork 进行编译,因为.. 不知道为什么要修复它,但它没有。据我了解,fzf/terminal/tty 不应该让 nim 真正阻止 fzf 写入/dev/tty。或者也许 python 做了一些我不知道的事情,触发 fzf 显示它的 TUI?
所以我的问题是如何说服 fzf 从 nim 显示其 TUI(以及为什么/如何还没有)。
【问题讨论】:
-
那个python程序的第二行不是将sys.stdout设置为fzf进程吗?如果没有其他程序,很难说。基本上,TUI 所做的是分别从标准输入和标准输出(可能还有标准错误)读取和写入。当你将它作为一个进程运行时,这些只是 Nim 中的流。因此,为了让 TUI 显示,您必须将 fzf 的标准输出重定向到程序的标准输出,并允许它从标准输入获取输入。