Python転職初心者向けエンジニアリングブログ

Pythonに魅了されたあなたへ。エンジニアリングの扉を開く転職初心者向けのブログへようこそ。このブログでは、Pythonの奥深さに迫りながら、エンジニアリングへの転職に役立つ情報を提供しています。未経験者から始めるPythonエンジニアリングの世界への一歩を踏み出すためのガイダンス、ベストプラクティス、そして成功事例など、初心者の方でもわかりやすいコンテンツをお届けします。

RubyとPythonの連携について徹底解説

LYPプレミアム会員 python

RubyとPythonの連携について徹底解説

RubyとPython、両者ともに非常に人気のあるプログラミング言語で、それぞれ異なる強みを持っています。Rubyは特にWeb開発で広く使用される(Ruby on Railsなど)高い生産性を持つ言語で、一方のPythonはシンプルさと機械学習やデータサイエンス分野における豊富なライブラリが魅力です。これら2つの言語を組み合わせることで、開発者は両方の長所を活かし、より強力なアプリケーションを構築できます。

本記事では、RubyとPythonの連携について、実際のコード例を交えながら初心者にもわかりやすく解説していきます。特に、次の4つのアプローチを取り上げます。

  1. RubyからPythonスクリプトを実行する
  2. PythonからRubyコードを呼び出す
  3. RubyとPython間でHTTP通信を行う
  4. 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-toolsgrpcライブラリを使って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を用いた連携まで、さまざまなアプローチが存在します。