【问题标题】:How to call a Python function from Lua?如何从 Lua 调用 Python 函数?
【发布时间】:2013-12-22 09:59:57
【问题描述】:

我想从我的 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)) 

【问题讨论】:

  • 我添加了我的答案,但是您使用的 Lua 实现、您使用的 Python 版本、您使用的 Lua 版本、您需要打包的项目大小等信息会非常有帮助。您是否受制于特定的实现/版本,或者您可能很灵活?您是想调用简单的全局函数,还是需要深度的语言间集成?您对 Stack Overflow 并不陌生。
  • 我需要调用base64,pickle库到lua中
  • Prashant Gaur,我想说 base64 很简单,可以用普通的 Lua 实现它。不确定Pickle 序列化,但快速谷歌搜索想出了这个Lua example int Lua-users community wiki
  • 您只需要这两个库的功能即可与 Lua 变量一起使用吗?您想用 pickle 序列化 Lua 表并使用 base64 和 Lua 数据?然后从 Lua 调用 Python 似乎有点疯狂。如果可以使用快速的 Lua 实现,请尝试使用一些 Lua 包或找到一些纯 C 库并将它们加载到 LuaJIT 中。

标签: python lua


【解决方案1】:

听起来 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

大多数东西都可以正常工作,但 lunatic-python 有一些限制。

  1. 它不是真正的线程安全的。在 lua 中使用 python 线程库会有意外的行为。
  2. 无法从 lua 调用带有关键字参数的 python 函数。一个想法是通过传递一个表在 lua 中模拟这一点,但我一直没有时间去实现它。
  3. 与 lupa 不同,lunatic-python 只有一个全局 lua 状态和一个 python VM 上下文。所以你不能使用 lunatic-python 创建多个 VM 运行时。

至于 lupa,注意它只是一个 python 模块,这意味着你必须使用 python 作为宿主语言——它不支持 lua 是“驱动”的用例语言。例如,您将无法从 lua 解释器或嵌入 lua 的 C/C++ 应用程序使用 lupa。 OTOH,Lunatic-Python 可以从桥的任一侧驱动。

【讨论】:

  • 如果我想做相反的事情怎么办?我想从 python 文件运行一个 lua 脚本。
  • 这个项目github.com/TitanSnow/ffilupa (ffi lupa) 还声称可以从 Lua 运行 Python
【解决方案2】:

我认为这些是您的选择:

  • 不要这样做:我同意其他人的建议,即您应该在纯 Lua 中找到一种方法,但也许您确实需要将两者结合起来。

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

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

【讨论】:

  • 据我所知,lupa 只允许你在 Python 中启动 Lua。如果没有现有的 Python,那么它就无济于事。 (另见另一个答案末尾的备注)
【解决方案3】:

您可以尝试this 库或为您的项目编写一些特定的桥接器,但这需要很好地了解 Lua C-API 和 Python C-API。

【讨论】:

    猜你喜欢
    • 2016-02-16
    • 2011-02-01
    • 2015-07-14
    • 2015-04-03
    • 1970-01-01
    • 2019-06-08
    • 2010-11-15
    • 2018-04-23
    • 1970-01-01
    相关资源
    最近更新 更多