2014-06-01 4 views
3

Я пытаюсь в основном отправлять команды через stdin на сеанс julia. Может ли кто-нибудь дать мне несколько указаний на то, почему этот кусочек кода, кажется, ничего не выполняет на стороне юлии? Кажется, что команда передается julia, но никогда не запускается, или julia никогда не выводит ее вывод в выходной поток ... Я бы ожидал, что в итоге вы увидите 4 (результат 2 + 2) в выходном потоке. . Есть предположения?Связь с Julia через ruby ​​PTY

require 'pty' 
require 'expect' 

class Session 
    def initialize    
     @output, @input, @pid = PTY.spawn('julia -q') 
    end 

    def exec(cmd) 
     @input.write(cmd + "\n")  
     @output.each { |line| print line } 
    end 
end 

session = Session.new() 
session.exec("2 + 2") 
+0

Это может быть существенно проще вставить Юлию через C: http://julia.readthedocs.org/en/latest/manual/embedding/. – StefanKarpinski

ответ

2

Хорошо, я думаю, что я понял, что происходит:

  1. вам нужно дать время Юлю запуска.

  2. вам необходимо отправить a \ r с \ n, чтобы сообщить Julia, чтобы прочитать строку.

Это работает для меня:

require 'pty' 
require 'expect' 

class Session 
    def initialize 
     @output, @input, @pid = PTY.spawn('julia -q') 
     sleep 5 
     # @output.expect(/julia\>/) would be nicer! 
    end 

    def exec(cmd) 
     @input.write(cmd + "\r\n" # This is control-m 
     @output.each { |line| print line } 
    end 
end 

session = Session.new() 
session.exec("2 + 2") 

Примечания:

Вместо неуклюжего сна 5, я думаю, было бы лучше с @output.expect("julia\>"). Но сон доказывает, почему он терпит неудачу.

+0

Да, это получилось ... Я перепутал с \ r \ n, но не со сном ... Думаю, я предположил, что это будет похоже на то, что я видел с помощью обычного терминала, и просто отвечаю на ввод когда вы готовы (например, как я могу вводить команды перед загрузкой vim). Спасибо чувак! – user3696058

+0

Это была интересная проблема для решения! –