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

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

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

LYPプレミアム会員 python

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

SwiftとPython、それぞれ異なる特性を持つ2つのプログラミング言語が、今や多くのプロジェクトで活用されています。SwiftはAppleによって開発され、iOSやmacOSのアプリ開発に使われるモダンで強力なプログラミング言語です。一方、Pythonはシンプルで使いやすい構文と豊富なライブラリによって、データ分析や機械学習、スクリプト作成など幅広い分野で活躍しています。

この2つの言語を連携させることで、iOSアプリからPythonの強力なライブラリや機能を使ったり、Python側からSwiftのアプリケーションにアクセスすることができるようになります。この記事では、SwiftとPythonを連携させる具体的な方法を、実際のコード例を交えながらわかりやすく説明します。

SwiftとPythonの連携アプローチ

SwiftとPythonを連携させる方法は、いくつかの異なるアプローチがあります。それぞれの方法をステップごとに見ていきましょう。

  1. SwiftからPythonスクリプトを実行する
  2. PythonからSwiftコードを呼び出す
  3. SwiftとPython間でHTTP通信を行う

SwiftからPythonスクリプトを実行する方法

SwiftからPythonスクリプトを実行する最も簡単な方法は、Processクラスを使って外部コマンドとしてPythonスクリプトを実行する方法です。これにより、SwiftアプリケーションからPythonのスクリプトやライブラリを直接呼び出すことができます。

次に、具体的な例を見ていきましょう。以下のSwiftコードは、Pythonのスクリプトを実行し、その結果を取得する方法を示しています。

import Foundation

let process = Process()
process.executableURL = URL(fileURLWithPath: "/usr/bin/python3") // Pythonの実行ファイルパス
process.arguments = ["hello.py"] // 実行するPythonスクリプト

let pipe = Pipe()
process.standardOutput = pipe

do {
    try process.run()
    process.waitUntilExit()

    let data = pipe.fileHandleForReading.readDataToEndOfFile()
    let output = String(data: data, encoding: .utf8) ?? ""
    print("Python script output: \(output)")
} catch {
    print("Error: \(error.localizedDescription)")
}

ここでは、SwiftのProcessを使ってhello.pyというPythonスクリプトを実行しています。このhello.pyの内容は非常にシンプルで、次のように定義されています。

# hello.py
print("Hello from Python!")

このSwiftコードを実行すると、次のような出力が得られます。

Python script output: Hello from Python!

このように、SwiftからPythonスクリプトを呼び出し、その結果を取得するのは非常に簡単です。これにより、SwiftアプリケーションからデータをPythonに渡して処理させ、その結果を再びSwift側で利用することが可能になります。

PythonからSwiftコードを呼び出す方法

次に、PythonからSwiftコードを呼び出す方法について説明します。Pythonで外部のコマンドを実行するために、subprocessモジュールを使用します。このモジュールを使うと、Node.jsやJavaなど他の言語と同様に、PythonからSwiftのコードを実行することができます。

以下はPythonコードの例です。このコードは、Swiftでコンパイルされたバイナリを実行します。

import subprocess

# Swiftでコンパイルされた実行ファイルを実行
result = subprocess.run(["./helloSwift"], capture_output=True, text=True)

# Swiftプログラムの出力を表示
print("Output from Swift program:", result.stdout)

この例では、事前にSwiftで作成したhelloSwiftというバイナリが存在していると仮定しています。このSwiftコードは次のような内容です。

print("Hello from Swift!")

Swiftコードを事前にコンパイルし、実行可能ファイルを生成するためには、次のようにコンパイルコマンドを使います。

swiftc hello.swift -o helloSwift

その後、Pythonスクリプトを実行すると、次のような結果が得られます。

Output from Swift program: Hello from Swift!

これで、PythonからSwiftプログラムを呼び出し、Swiftで実行した結果をPythonで取得できることが確認できました。

HTTP通信を用いたSwiftとPythonの連携

次に、HTTP通信を利用したSwiftとPythonの連携方法を紹介します。この方法は、Swift側とPython側でそれぞれサーバーとクライアントとして動作させ、HTTPリクエストを通じてデータをやり取りします。

PythonでFlaskを使ったHTTPサーバー

まず、PythonでFlaskという軽量なWebフレームワークを使って簡単なHTTPサーバーを構築します。Flaskはセットアップが非常に簡単で、短時間で動作するサーバーを作ることができます。

以下がPython側のコードです。

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)

このPythonコードは、Flaskを使って/api/helloというエンドポイントを用意し、GETリクエストに対して"Hello from Python!"というメッセージを返すシンプルなHTTPサーバーです。

SwiftでHTTPリクエストを送信

次に、Swift側でこのPythonサーバーにリクエストを送るHTTPクライアントを作成します。SwiftにはURLSessionというHTTP通信を扱うためのクラスが用意されており、これを使うことで簡単にリクエストを送信できます。

以下にSwiftでのHTTPリクエストの例を示します。

import Foundation

let url = URL(string: "http://localhost:5000/api/hello")!

let task = URLSession.shared.dataTask(with: url) { data, response, error in
    if let error = error {
        print("Error: \(error)")
        return
    }
    guard let data = data else {
        print("No data")
        return
    }
    let responseString = String(data: data, encoding: .utf8)
    print("Response from Python server: \(responseString ?? "")")
}

task.resume()

このSwiftコードは、http://localhost:5000/api/helloにGETリクエストを送り、サーバーから返されたレスポンスを出力します。

実行結果は次のようになります。

Response from Python server: {"message":"Hello from Python!"}

これにより、HTTP通信を介してSwiftとPythonがデータをやり取りできるようになります。この方法は、APIを利用して異なる言語間で通信を行う際に非常に便利です。

gRPCを利用したSwiftとPythonの連携

さらに高度な方法として、gRPC(Googleが開発した効率的なリモートプロシージャコールプロトコル)を利用してSwiftとPythonを連携させることも可能です。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(G

reeter(), server)
    server.add_insecure_port('[::]:50051')
    server.start()
    server.wait_for_termination()

if __name__ == '__main__':
    serve()
SwiftでgRPCクライアントの実装

Swift側では、grpc-swiftというライブラリを使ってgRPCクライアントを実装します。Protoファイルを基にSwiftのコードを生成し、以下のようにリクエストを送信します。

import GRPC
import NIO

let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
let channel = ClientConnection.insecure(group: group).connect(host: "localhost", port: 50051)
let client = GreeterClient(channel: channel)

let request = HelloRequest.with { $0.name = "Swift" }
let response = try client.sayHello(request).response.wait()

print("Response: \(response.message)")

gRPCを使うことで、SwiftとPythonの間で型安全かつ効率的な通信を実現できます。

まとめ

SwiftとPythonの連携は、iOSアプリケーション開発やシステム間の連携において非常に役立つ技術です。Processsubprocessを用いたコマンド実行、HTTPを介したデータ通信、さらにgRPCを使った高速な通信まで、さまざまな方法があります。