在Ruby进程中嵌入Python CLI?

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).

cam*_*cam 1

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)