python执行lua代码

摘要:
答案是否定的,因为Python用于执行lua代码的包带有pyd形式的lua解释器。因此,Lua不具备独立开发大型应用程序的能力。虽然它和Python是动态语言,但Lua拥有JIT技术,可以将Lua代码编译成非常快的机器代码,在某些情况下甚至比某些编译语言更快。让我们看看如何使用它。Python需要使用一个包:lupa来执行lua代码。

楔子

下面我们来看看如何使用python来执行lua代码。如果了解lua的话,可能会感到器官,我们之前调用C、调用go,都是调用其编写的动态库。可lua是脚本语言啊,难道也可以写动态库吗?其实我们不是调用动态库,而是直接执行lua代码。

这时候可能又有人猜到了,python执行lua代码,本质上应该还是通过lua解释器来调用吧。答案不是的,因为python的执行lua代码的包自带了一个lua解释器,并且是以pyd的形式。

因为lua解释器非常的精简,自带lua解释器的pyd文件只有500k左右,并且这还是包含了内置的标准库。在lua5.3中,一些内置的模块全部嵌入到解释器里面了。

为什么使用lua

首先lua它的定位就是嵌入到其它语言中,比如C++,来提供一些扩展功能。因此lua不具备独立开发大型应用的功能,虽然它和python都是动态语言,但是lua中有JIT(即时编译)技术,可以将lua代码编译成非常快速的机器码,甚至某些时候比一些编译语言还要快,下面我们就来看看如何使用吧。

python执行lua代码,需要使用一个包:lupa,直接pip install lupa即可。

举个栗子

import lupa

# 实例化一个lua解释器
lua = lupa.LuaRuntime()

# 类似于python中的eval,将字符串当成代码来执行
# 同时返回其结果
print(lua.eval("1 + 1"))  # 2


lua_func = lua.eval(
    """
    function (f, str, substr)
        return f(str, substr)
    end
    """
)

print(lua_func(str.find, "hello satori", "satori"))  # 6

try:
    print(lua.eval("2 ** 2"))
except Exception as e:
    print(e)  # error loading code: [string "<python>"]:1: unexpected symbol near '*'

# lua中的幂运算使用的是 ^
print(lua.eval("2 ^ 5"))  # 32

# 如果就想使用python的语法的话
print(lua.eval("python.eval('2 ** 5')"))  # 32

print(lua.eval("python.builtins.list('abc123')"))  # ['a', 'b', 'c', '1', '2', '3']

lua中的python对象

import lupa

lua = lupa.LuaRuntime()

lua_type = lua.globals().type  # lua中的type函数
print(lua_type(1))  # number
print(lua_type("xxx"))  # string
print(lua_type([]))  # userdata
print(lua_type(()))  # userdata
print(lua_type({}))  # userdata

python的字典也可以放在lua里面

import lupa

lua = lupa.LuaRuntime()

lua_func = lua.eval(
    """
    function (obj, key)
        return obj[key]
    end
    """
)

d = {"a": 1, "name": "satori"}
print(lua_func(d, "a"))  # 1
print(lua_func(d, "name"))  # satori

具体可以看https://pypi.org/project/lupa/0.18/,写的比较详细了。

免责声明:文章转载自《python执行lua代码》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇TeamCity安装Agent(Windows和Linux系统下)建行互联网银企被扫支付下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

离线安装python的ibm_db模块

目前手头的项目是一个UI自动化框架,其中有些模块的功能需要与DB2数据库交互,于是百度了一下python操作DB2的模块是 ibm_db。 然而我的工作机器是一台windows堡垒机,不能联网,固不能直接使用pip进行安装,所以只能使用离线安装包了。 百度了一下,由于ibm_db模块的安装依赖于其他文件,所以需要下载好几个文件,按照百度上的方法试了一通,然...

SpringCloud 整合 Python 服务

SpringCloud提供了一个组件Sidecar,可以将非Java的微服务整合到SpringCloud中,本质就是建立一个Sidecar工程作为代理,Sidecar工程注册到Eureka服务,同时Sidecar工程调用非Java微服务的Http接口。 吐槽:看了很多博客,都是举得一个Python微服务的例子,如果Python只有一个服务,而不是分布式的服...

Selenium---元素定位之CSS定位

CSS 选择器: 常见符号: #表示 id选择器 .表示 class选择器 >表示子元素,层级 一个空格也表示子元素,但是是所有的后代子元素,相当于 xpath 中的相对路径 一、css:属性定位 1.css可以通过元素的id、class、标签这三个常规属性直接定位到 2.如下是百度输入框的的html代码: <input type="text"...

lua语言(2):闭包、模式匹配、日期、编译、模块

lua中的闭包 在lua语言中,函数是严格遵循词法定界(lexical scoping)的第一类值(first-class value)。 第一类值意味着lua语言中的函数与其它常见类型的值(例如数值和字符串)具有同等权限:一个程序可以将某个函数保存到变量、或表中,也可以将函数作为参数传递给另外一个函数,还可以将函数作为某个函数的返回值返回。 词法定界意味...

Python+Apache环境搭建

Python+Apache环境搭建 Python+apache搭建时需要apache拓展mod_wsgi模块,apache启动时自动加载mod_wsgi模块,通过mod_wsgi与python通信,实现python部署在apache上。 安装 1.下载源码包mod_wsgi 2.解压缩mod_wsgi包 tar zxvf mod_wsgi-4.6.8.t...

在pycharm中运行python程序

安装PyCharm 安装过程取决于您的操作系统:   在Windows上安装PyCharm 运行.exe您已下载的文件,并按照PyCharm安装向导的说明进行操作。   在macOS上安装PyCharm 打开.dmg您已下载的软件包,并将PyCharm拖到Applications文件夹。   在Linux上安装PyCharm .tar.gz将您下载的存档打...