我正在尝试将我的一个小python脚本移植到nim。其核心是对fzf的调用:
fzf = subprocess.Popen(["fzf"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
stdout, stderr = fzf.communicate(some_data)据我所知,fzf打开/dev/tty与用户进行交互,并使用stdin/stdout与调用它的程序进行通信。腐蚀的尼姆密码:
var p = startProcess(path_to_fzf)
var stream = p.inputStream()
stream.write(some_data)
stream.flush()但是在我的nim版本中,fzf并没有出现。但输入到终端是读取,因为根据我的输入,正确的项目被选择。
我不知道为什么会这样。我想也许nim用startProcess创建了一个PTY,但是/proc/sys/kernel/pty/nr并没有增加,所以我认为情况并非如此。我试着用-d:useFork编译是因为..。嗯,不知道为什么要修复它,但它没有。据我所知,fzf / and /tty实际上不应该是尼姆可以做的事情,以防止fzf写到/dev/tty。或者python做了一些我不知道的事情,触发fzf来显示它的TUI?
因此,我的问题是如何说服fzf从nim中显示其TUI (以及为什么/如何还没有)。
发布于 2018-08-20 21:43:24
作为一个正确的答案,我在poParentStreams模块中找到了选项osproc。可以像这样使用它来启动一个TUI:
import osproc
let process = startProcess("htop", options = {poParentStreams, poUsePath})
let eCode = process.waitForExit()
if eCode == 0:
echo "htop completed successfully"
else:
echo "htop aborted with error code: " & $eCode@syntonym在注释中指出,fzf打开/dev/tty是为了在不破坏stdin/stdout流的情况下显示/dev/tty。我不完全确定为什么这在Nim中不起作用,但解决方案当然是将结果写入指定的管道中并从中读出,如下所示:
import osproc
import posix
import streams
discard mkfifo("/tmp/fzfoutput", 0o644)
let process = startProcess("echo \"hello\nworld\" | fzf > /tmp/fzfoutput", options = {poUsePath, poEvalCommand, poParentStreams})
var f: File
discard f.open("/tmp/fzfoutput")
echo "Output of fzf:" & f.readLine()
let eCode = process.waitForExit()
if eCode == 0:
echo "fzf completed successfully"
else:
echo "fzf aborted with error code: " & $eCode
discard execCmd("rm /tmp/fzfoutput")https://stackoverflow.com/questions/51932881
复制相似问题