如何从Lua调用Python函数?

时间:2013-12-05 12:44:10

标签: python lua

我想从我的lua文件中运行一个python脚本。我怎样才能做到这一点?

示例:

Python代码

#sum.py file
def sum_from_python(a,b)
    return a+b 

Lua代码

--main.lua file
print(sum_from_python(2,3)) 

3 个答案:

答案 0 :(得分:5)

听起来像Lunatic-Python正是你想要的。有一个lunatic-python的分支比原来更好。我自己曾经为自己做过几次错误修复。

重复使用你的例子,

Python代码:

# sum.py
def sum_from_python(a, b):
  return a + b

Lua代码:

-- main.lua
py = require 'python'

sum_from_python = py.import "sum".sum_from_python
print( sum_from_python(2,3) )

输出:

lua main.lua
5

大部分内容都按照您的预期运行,但是对于疯狂蟒蛇有一些限制。

  1. 这不是真正的线程安全。在lua中使用python线程库会产生意外行为。
  2. 无法使用lua中的关键字参数调用python函数。一个想法是通过传递一个表来模仿lua,但我从来没有实现过。
  3. 与lupa不同,lunatic-python只有一个全局lua状态和一个python VM上下文。因此,您无法使用lunatic-python创建多个VM运行时。
  4. 至于lupa,请注意它只是一个 python模块,这意味着你必须使用python作为宿主语言 - 它不支持lua是“驱动”的用例语言。例如,您将无法使用lua解释器中的lupa或嵌入lua的C / C ++应用程序。 OTOH,Lunatic-Python可以从桥的任何一侧驱动。

答案 1 :(得分:3)

我认为这些是您的选择:

  • 不要这样做:我同意别人的建议,你应该找到一种方法在纯Lua中做到这一点,但也许你真的需要整合这两者。

  • 您可以使用SWIG(www.swig.org)将Lua C API导出到Python。您可以通过使用C ++绑定(如lua-icxx.sf.net)节省一些时间,但这实际上取决于您的要求。

  • 您可以使用现有的库;疯狂的蟒蛇死了AFAIK,但LUPA看起来身体健康(https://pypi.python.org/pypi/lupa)。

答案 2 :(得分:1)

您可以尝试this库或编写一些特定于您的项目的桥接器,但这需要熟悉Lua C-API和Python C-API。