有个程序实现了某个协议,可以在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)
@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))
仔细看了下open的文档,我用open(cmd, “r+”)就异步运行了,现在已经把Julia与这个协议程序互通数据的“最小demo”做完80%了。太感谢你的建议和例子了,否则不会这么快。之所以没用pipe,是因为不太懂“重定向”的含义。其实,根本没怎么看懂与“IO”相关的那些东西,仅仅明白了IO是Any下的抽象类、IOStream是缓冲、stdin/stdout/stderr是指向标准IO的变量。
以前都是在一个程序里玩耍,顶多用CLI和程序沟通,第一次做不同程序之间的沟通,颇感陌生。另外,Julia太强大了!之所以现在还没完成仅仅因为我还没搞清楚一些通信协议的细节,实际上大头儿和最难的部分,感觉都被Julia自动实现了,哈哈