RubyとPythonの連携について徹底解説
RubyとPython、両者ともに非常に人気のあるプログラミング言語で、それぞれ異なる強みを持っています。Rubyは特にWeb開発で広く使用される(Ruby on Railsなど)高い生産性を持つ言語で、一方のPythonはシンプルさと機械学習やデータサイエンス分野における豊富なライブラリが魅力です。これら2つの言語を組み合わせることで、開発者は両方の長所を活かし、より強力なアプリケーションを構築できます。
本記事では、RubyとPythonの連携について、実際のコード例を交えながら初心者にもわかりやすく解説していきます。特に、次の4つのアプローチを取り上げます。
- RubyからPythonスクリプトを実行する
- PythonからRubyコードを呼び出す
- RubyとPython間でHTTP通信を行う
- RubyとPython間でgRPCを使って連携する
RubyからPythonスクリプトを実行する
まずは、RubyからPythonのスクリプトを実行する方法です。これは最もシンプルで、外部コマンドとしてPythonスクリプトを呼び出す形で行います。Rubyには、外部プログラムを実行するためのメソッドが用意されているので、それを使ってPythonを呼び出します。
以下のRubyコードは、Pythonスクリプトを実行し、その結果を取得する例です。
# RubyからPythonスクリプトを実行 output = `python3 hello.py` puts "Python script output: #{output}"
このコードでは、バックティック `
(テンキーの
~
キーの下にある)を使って外部コマンドとしてPythonスクリプトを実行しています。次に実行するPythonスクリプトhello.py
は次のように定義されています。
# hello.py print("Hello from Python!")
Rubyコードを実行すると、次のような出力が得られます。
Python script output: Hello from Python!
RubyからPythonを実行して結果を得るのは、このように非常に簡単です。これにより、Rubyアプリケーション内でPythonのデータ処理や機械学習のライブラリを利用することができます。
PythonからRubyコードを呼び出す
次に、PythonからRubyコードを実行する方法を見ていきます。Pythonでも、Rubyから外部コマンドとして実行するのと同様に、subprocess
モジュールを使用してRubyのスクリプトを実行できます。
以下はPythonからRubyのスクリプトを呼び出す例です。
import subprocess # Rubyスクリプトを実行 result = subprocess.run(["ruby", "hello.rb"], capture_output=True, text=True) # Rubyプログラムの出力を表示 print("Output from Ruby program:", result.stdout)
このPythonコードは、Rubyのスクリプトhello.rb
を呼び出して、その出力を取得しています。次に、実行するRubyスクリプトhello.rb
は次のように定義されています。
# hello.rb puts "Hello from Ruby!"
Pythonコードを実行すると、次のような結果が得られます。
Output from Ruby program: Hello from Ruby!
このように、PythonからもRubyのコードを実行するのは簡単です。PythonからRubyの豊富なWeb開発フレームワークやツールを利用することが可能になります。
HTTP通信を利用したRubyとPythonの連携
次に、HTTP通信を利用してRubyとPythonを連携させる方法を紹介します。これは、両方の言語でWebサーバーやクライアントとして動作させ、HTTPリクエストを通じてデータをやり取りする方法です。REST APIを利用して、システムやサービス間での連携が可能になります。
PythonでFlaskを使ったHTTPサーバー
まず、PythonでFlaskという軽量なWebフレームワークを使って簡単なHTTPサーバーを構築します。Flaskはセットアップが非常に簡単で、少ないコードでサーバーを立てることができます。
from flask import Flask, jsonify app = Flask(__name__) @app.route('/api/hello', methods=['GET']) def hello(): return jsonify(message="Hello from Python!") if __name__ == '__main__': app.run(debug=True, port=5000)
このコードは、/api/hello
というエンドポイントにGETリクエストが来た場合に、"Hello from Python!"
というメッセージを返す簡単なサーバーです。
RubyでHTTPクライアント
次に、RubyでこのPythonサーバーにリクエストを送信するクライアントを作成します。RubyではNet::HTTP
を使用してHTTPリクエストを送ることができます。
require 'net/http' require 'json' url = URI.parse('http://localhost:5000/api/hello') response = Net::HTTP.get(url) json_response = JSON.parse(response) puts "Response from Python server: #{json_response['message']}"
このRubyコードは、Pythonのサーバーに対してGETリクエストを送り、返ってきたレスポンスをJSON形式でパースして出力します。
実行結果は次のようになります。
Response from Python server: Hello from Python!
このように、HTTPを使ってRubyとPythonがデータをやり取りできるようになります。APIを通じて通信を行うことで、システム間での柔軟な連携が可能です。
gRPCを利用したRubyとPythonの連携
さらに高度な方法として、gRPC(Googleが開発したリモートプロシージャコールプロトコル)を使用した連携も可能です。gRPCは、クライアントとサーバー間での効率的なデータ交換を可能にします。
gRPCのインターフェース定義
まず、gRPCを使うためにはProtocol Buffers(通称: Proto)を使ってサービスインターフェースを定義します。以下は、service.proto
というファイルに記述するProtoファイルの例です。
syntax = "proto3"; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string name = 1; } message HelloReply { string message = 1; }
PythonでgRPCサーバーの実装
次に、PythonでgRPCサーバーを実装します。
import grpc from concurrent import futures import hello_pb2 import hello_pb2_grpc class Greeter(hello_pb2_grpc.GreeterServicer): def SayHello(self, request, context): return hello_pb2.HelloReply(message=f'Hello {request.name} from Python!') def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) hello_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server) server.add_insecure_port('[::]:50051') server.start() server.wait_for_termination() if __name__ == '__main__': serve()
RubyでgRPCクライアントの実装
Rubyでは、grpc-tools
とgrpc
ライブラリを使ってgRPCクライアントを実装します。以下はその例です。
require 'grpc' require 'hello_services_pb' stub = Hello::Greeter::Stub.new('localhost:50051', :this_channel_is_insecure) request = Hello::HelloRequest.new(name: 'Ruby') response = stub.say_hello(request) puts "Response from Python server: #{response.message}"
gRPCを使用することで、RubyとPython間で高速かつ型安全なデータ通信が可能になります。
まとめ
RubyとPythonを連携させることにより、両者の強みを最大限に活かしたアプリケーション開発が可能になります。この記事で紹介したように、外部スクリプトの実行やHTTP通信、さらにはgRPCを用いた連携まで、さまざまなアプローチが存在します。