请问Julia如何与外部程序互传数据?不是读写文件的那种

有个程序实现了某个协议,可以在shell(或CLI)里当“应答机”使用。用shell将它启动后,等待用户输入询问,接收询问后给出回答,就这么简单。问题是,我只知道如何使用Julia代替shell打开它,不知道Julia怎么代替用户提问然后处理回答。
OS:win10x64
Julia:1.5.3
那个程序的后缀名:.exe

欢迎欢迎~

可以看下 open 函数, 把读写都设置为 true

open(command, stdio=devnull; write::Bool = false, read::Bool = !write)

https://docs.julialang.org/en/v1/base/io-network/#Base.open

2 个赞

@Jun
我直接把原先用julia代替shell启动xxx.exe的命令放到你给出的那个open函数里了:
open(cmd /c xxx.exe protocol one, stdio=devnull; write::Bool=true, read::Bool=true)
报错说没有没有叫做write::Bool的关键字参数,于是我把布尔类型注释删掉了:
open(... write=ture, read=true)
报错说没有方法匹配open函数里stdio=devnull,于是我用methods(open)查看了方法有哪些,发现stdio=union{…},而union里没有devnull的类型“Base.DevNull”,于是我索性把stdio去掉了:
open(; write=true, read=true)
然后,我现在不知道怎么对已经运行的协议程序进行询问和查看回答?
而且julia在open终于成功后,命令提示符向右错位了几个空格,命令可以正常输入和执行,但显示乱了······(我在VSCode里执行的julia)
图片

举个简单的例子吧:

假设有一个 x.jl 文件如下:

while true
    s = readline()
    if s == "q"
        break
    else
        println(repeat(s, 2))
    end
end

然后可以这么用:

julia> p = open(pipeline(`julia x.jl`, stderr=devnull), "r+") # 这里你可以把 `julia x.jl` 换成你的 exe
Process(`julia x.jl`, ProcessRunning)

julia> println(p, "123")

julia> readline(p)
"123123"

julia> println(p, "q")

julia> p
Process(`julia x.jl`, ProcessExited(0))
2 个赞

仔细看了下open的文档,我用open(cmd, “r+”)就异步运行了,现在已经把Julia与这个协议程序互通数据的“最小demo”做完80%了。太感谢你的建议和例子了,否则不会这么快。之所以没用pipe,是因为不太懂“重定向”的含义。其实,根本没怎么看懂与“IO”相关的那些东西,仅仅明白了IO是Any下的抽象类、IOStream是缓冲、stdin/stdout/stderr是指向标准IO的变量。

以前都是在一个程序里玩耍,顶多用CLI和程序沟通,第一次做不同程序之间的沟通,颇感陌生。另外,Julia太强大了!之所以现在还没完成仅仅因为我还没搞清楚一些通信协议的细节,实际上大头儿和最难的部分,感觉都被Julia自动实现了,哈哈 :rofl: