Tim*_*Tim 5 ruby python subprocess interactive pipe
作为一个更大的项目的一部分,我试图在Ruby进程中"嵌入"一个Python交互式解释器.我希望能够做类似以下的事情:
$ irb
irb(main):001:0> pipe = IO.popen("python", "w+")
=> #<IO:0x7f3dba4977e0>
irb(main):002:0> pipe.puts "print 'hello'"
=> nil
irb(main):003:0> pipe.gets
=> 'hello\n'
Run Code Online (Sandbox Code Playgroud)
不幸的是,gets似乎挂起而不是从Python进程返回任何类型的输出.我已经尝试过这个程序的变体open3,使用模式r+代替w+,以及其他一些小选项(python -u其中),但没有成功.
有没有办法从Ruby建立与Python shell的交互式通信 - 实际上,"包装"Python CLI?我在x86_64机器上使用Ruby 1.8.7(2010-06-23 patchlevel 299)和Python 2.6.6,但希望解决方案在Python版本中可移植(ish).
popen看起来不像 python 的终端,所以你不是在交互模式下运行。您可以使用以下命令强制 python 以交互模式启动-i:
IO.popen("python -i", "r+") do |py|
while cmd = gets
py.puts cmd
puts py.gets
end
end
Run Code Online (Sandbox Code Playgroud)
您可能需要做一些工作来删除>>>提示等。
编辑:这是多行友好版本(我保留代码清晰并回答了原始问题):
IO.popen("python -i", "r+") do |py|
loop do
fds = IO.select [py, STDIN]
fds.each do |(fd)|
case fd
when nil; next
when STDIN; py.puts gets
else; puts py.gets
end
end
end
end
Run Code Online (Sandbox Code Playgroud)