{}const=>[]async()letfn</>var
開発LuaPython

Python + Lua: 1つのプロジェクトで2つの言語を使う方法

PythonとLuaを1つのプロジェクトに統合する方法、その必要性、および統合方法

К

Kodik

著者

2分で読める

🤝「Python + Lua」のペアは、Pythonの豊富なエコシステムとLuaの速度/組み込み性を組み合わせています。

以下は、サンプル、データ共有のヒント、クイックスタートチェックリストを使用して統合するための3つの実用的な方法です。

🔍 PythonとLuaを組み合わせる理由

Python

Lua

図書館の海:ウェブ、AI、データ

最小ランタイム、簡単に組み込み可能

シンプルなコード、迅速なプロトタイプ

しばしばタイトなループ(LuaJIT)でより速く

API/バックエンド、データ処理

エンジン/ゲーム、プラグインをスクリプト化する

🔥 10万人以上の学生が参加中

理論を読むのに疲れた?
コーディングの時間だ!

Kodik — 実践でプログラミングを学ぶアプリ。AIメンター、インタラクティブなレッスン、実際のプロジェクト。

🤖 AI 24時間
🎓 修了証
💰 無料
🚀 始める
今日参加

🎯 典型的なシナリオ

  • ゲームとシミュレーション:Pythonサーバー/ツール、Luaゲームロジック。

  • プラグイン:ユーザーは Lua で拡張機能を作成し、カーネルは Python で拡張機能を作成します。

  • 自動化: Pythonオーケストレーション、タスク用のLuaスクリプト。

🛠 3つの統合方法

1) lupa (LuaJIT) を介して Lua を Python に組み込む

pip install lupa

Python → Luaを呼び出す

from lupa import LuaRuntime
lua = LuaRuntime(unpack_returned_tuples=True)

# 1) 関数を直接取得する
greet = lua.eval('function(name) return "Hello, " .. name .. "!" end'int(greet("Code"))  # こんにちは、コディック!

# 2)テーブルをオブジェクトとして扱う
Vector = lua.eval('''
  function (x, y)
    return { x = x or 0, y = y or 0,
      len = function(self) return math.sqrt(self.x*self.x + self.y*self.y) end
    }
  end
''')
v = Vector(3, 4)
print(v.len(v))  # 5.0

Lua → Pythonを呼び出す(コールバック)

from lupa import LuaRuntime
lua = LuaRuntime()
def py_log(msg): print("[PY]", msg)

lua.globals().py_log = py_log
lua.execute('py_log("Hello from Lua!")'')  # [PY] Luaからこんにちは!

# Python関数をLuaアルゴリズムに渡します
lua.execute('''
  function apply_twice(fn, x) return fn(fn(x)) end
''')
apply_twice = lua.eval('apply_twice')
print(apply_twice(lambda v: v * 2, 5))  # 20

利点:シンプルで非常に高速(LuaJIT)、双方向の呼び出し。

短所:バイナリへの依存、タイプのニュアンス。

2) Lua をプロセスとして実行します (subprocess + JSON)

初心者にもわかりやすい方法:標準的なストリームとシリアル化を介して通信します。

Luaスクリプト( stdin → stdout )

-- file: worker.lua
local json = require("dkjson")   -- или cjson, если доступен
local input = io.read("*a")
local req = json.decode(input)

local result = { sum = req.a + req.b, ok = true }
io.write(json.encode(result))

Pythonラッパー

import json, subprocess

payload = json.dumps({"a": 2, "b": 40})
proc = subprocess.run(
    ["lua", "worker.lua"],
    input=payload, text=True, capture_output=True, check=True
)
res = json.loads(proc.stdout)
print(res["sum"])  # 42

利点:メディアの独立性、デバッグ/スケーリングが簡単。短所:IPCは直接呼び出しよりも高価です。

3) 拡張: 一般的なCレイヤー/FFI

既存のC/C++モジュールがある場合に適しています。PythonとLuaは同じネイティブコードにリンクされます。初心者は、そのようなパスがあることを知っていれば十分です。より深く、後で。

🔄 痛みのないデータ交換

何を伝えるか

どのように伝えるか

コメント

数字、文字列、ブール値

関数の引数(lupa)/ JSON

Lua では、数値はデフォルトで float であることに注意してください

配列/テーブル

Luaテーブル↔Pythonリスト/辞書

複雑な構造の場合は、JSON/MsgPackでシリアル化します

バイナリデータ

Base64 /ファイル/共有メモリ

サブプロセススキーマでは、ファイル/パイプの方が便利です

頻繁なレーキ:フローティングタイプ(int vs float)、文字列エンコーディング(UTF-8!)、構造体の再帰。

🧯 エラーとログ

例外

  • lupa: LuaエラーはPython例外を引き起こします。try/except呼び出しをラップします。

  • subprocess: returncode をチェックして、stderr をパースしてください。

ログ

  • ログの共通プレフィックスを作成します: [PY][LUA]

  • サブプロセスの場合は、入力/出力をログに記録します(大きなペイロードをトリミングします)。

💡ミニサンプル:Luaの「ルール」、Pythonのサービス

-- rules.lua
return {
  discount = function(price)
    if price >= 100 then return price * 0.9 end
    return price
  end
}
CODE_BLOCK_6__

💡ミニサンプル: JSON経由のミニRPC

-- rpc.lua (Lua-процесс)
local json = require "dkjson"
local fn = {
  hello = function(args) return "Hi, " .. (args.name or "anon") end,
  add   = function(a,b) return a+b end
}
local req = json.decode(io.read("*a"))
local ok, out = pcall(function()
  if req.fn == "add" then return fn.add(req.a, req.b)
  else return fn.hello(req) end
end)
io.write(json.encode({ ok = ok, result = out }))
CODE_BLOCK_8__

📚 このテーマについてもっと詳しく知りたいですか?

アプリで コディック PythonとLuaの詳細なレッスン、ステップバイステップのエクササイズ、エラーの解析、そして携帯電話やブラウザで簡単に練習できるものが見つかります。

ニュース、新機能、役立つ資料を知りたい場合は、当社のニュースレターをご購読ください。 テレグラムチャンネル. そこは快適で、ビジネスに向いており、コードへの愛情が ❤️

💬 Luaで何を学びますか?ルール、設定、または「ホット」計算ですか?

🎯先延ばしをやめよう

記事は気に入った?
実践の時間だ!

Kodikでは読むだけでなく、すぐにコードを書く。理論 + 実践 = 本当のスキル。

即座に実践
🧠AIがコードを説明
🏆修了証

登録不要 • カード不要