zoukankan      html  css  js  c++  java
  • python执行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/,写的比较详细了。

  • 相关阅读:
    Oracle如何查询不等于某数值
    《Linux系列》- 查看Linux日志
    《数据库优化》- MySQL视图
    《数据库优化》- MySQL优化
    《面试经典系列》- MySQL数据库存储引擎
    《面试经典系列》- Java获取反射机制的三种方法
    《面试经典系列》- 从底层理解==和equals的区别
    《面试经典系列》- 乐观锁和悲观锁及其应用场景
    数据结构之HashMap
    收藏学习地址
  • 原文地址:https://www.cnblogs.com/traditional/p/13194862.html
Copyright © 2011-2022 走看看