Трубопровод между Python и Ruby - PullRequest
1 голос
/ 27 марта 2019

Я пишу код, который может передавать данные между Python и скриптом Ruby, используя «конвейер», но не может заставить его работать. Любые рекомендации или альтернативные способы?

Я написал простые сценарии, чтобы заставить его работать и опираться на них. Цель состоит в том, чтобы интегрировать функциональность «конвейера» в проект. В проекте скрипт Python должен отправить файл .txt в скрипт Ruby, который извлечет значения параметров и сохранит их в соответствующих массивах. Затем я хочу отправить массивы обратно в скрипт Python.

Простые скрипты, которые я создал до сих пор, вдохновлены https://www.decalage.info/python/ruby_bridge. При запуске он продолжается без остановки и не дает никаких результатов. Цель состоит в том, чтобы отправить целое число 6 в скрипт Ruby, в который добавлено 5, и отправить сумму обратно в скрипт Python. При прерывании с помощью ctrl + c записывается следующее:

File "./com_ruby.py", line 33, in <module>
    sss = slave.stdout.readline().rstrip()

Мой скрипт на Python:

from subprocess import Popen, PIPE, STDOUT

print('launching slave process...')
slave = Popen(['ruby', 'provar.rb'], stdin=PIPE, stdout=PIPE, stderr=STDOUT)

while True:

    num = bytes([6])
    slave.stdin.write(num)
    # result will be a list of lines:
    result = []
    # read slave output line by line, until we reach "[end]"
    while True:
        # check if slave has terminated:
        if slave.poll() is not None:
            print('slave has terminated.')
            exit()
        # read one line, remove newline chars and trailing spaces:
        sss = slave.stdout.readline().rstrip()
        print('line: ', sss)
        if sss == '[end]':
            break
        result.append(sss)
    print('result:')
    print('\n'.join(result))

Мой скрипт на Ruby:

while cmd = STDIN.gets

    cmd.chop!

    cmd = cmd + 5

    cmd.to_s
    print eval(cmd),"\n"
    # append [end] so that master knows it's the last line:
    print "[end]\n"
    # flush stdout to avoid buffering issues:
    STDOUT.flush

end

Есть ли лучший, но простой способ сделать "передачу данных" между двумя сценариями?

...