python中lua的cffi绑定

ffilupa的Python项目详细描述


buildcoverageversionlicense

连接python和lua的现代双向桥梁。

Major Features

对于python用户

  • 使用CFFI作为后端将lua集成到python中,后者在cpython和pypyy上都运行得很快。
  • 在一个python进程中运行多个lua运行时。
  • 链接到系统中安装的多个lua库并使用它们的luarocks
  • python和lua之间的零拷贝数据共享。
  • 对lua对象的无缝操作。
  • 可破解和可扩展;可定制的交互行为。
  • 用lua来突破python的gil极限的并行数值计算。

对于lua用户

  • 通过使用python的模块来丰富lua的能力。
  • 链接到cpython和pypy。
  • 对python对象的无缝操作。

最重要的是,菲卢帕有很多乐趣!

Why ffilupa

lupa

相比
  • lupa使用cython作为后端,这对pypy不太友好,并且不可扩展。
  • lupa不支持lua作为宿主语言,这意味着您不能在lua程序中使用它。
  • lupa不支持对lua对象的无缝操作。
  • lupa没有得到积极的发展。
  • 卢帕启发了菲卢帕很多。

LunaticPython

相比
  • 好吧,LunaticPython太老了,已经很久没有开发了。
  • lunaticpython不支持多个lua运行时。
  • lunaticpython泄露了新功能。

Installation

在安装ffilupa之前,请检查您是否安装了lua的开发库。 在ubuntu上,你可以安装liblua5.3-devliblua5.2-dev

$ sudo apt install [liblua5.3-dev|liblua5.2-dev]

在Mac OS X上,您可以使用Homebrew

$ brew install lua pkg-config

在安装过程中,ffilupa将通过pkg-config自动找到lua库。

确保在系统中安装了Python3.5+, 包括它的开发文件和合适的c编译器。 在ubuntu上:

$ sudo apt install python3-dev

在Mac OS X上:

$ brew install python

最好安装ffilupa的依赖项:

$ pip install cffi semantic_version

这是可选的;如果您以前没有安装过,ffilupa会安装它们。

安装稳定版本

python用户的

$ pip install ffilupa

从git branch安装开发版本

对于python用户
$ pip install git+https://github.com/TitanSnow/ffilupa.git

对于lua用户

确保已安装luarocks

$ git clone https://github.com/TitanSnow/ffilupa.git
$ cd ffilupa
$ luarocks make

有关安装的常见问题解答

如何处理异常“找不到必需的lua lib”?

请检查lua的安装。ffilupa目前只支持lua 5.2和5.3。 然后重新安装ffilupa以查找最近安装的lua库。

ffilupa是否支持windows?

ffilupa可以支持windows,但现在不行。它可能在下一个小版本中支持windows。

Usage

对于python用户

简要介绍
>>> importffilupa>>> lua=ffilupa.LuaRuntime()>>> lua_func=lua.eval('''
...     function(a, b) -- a plus b
...         return a + b
...     end
... ''')>>> lua_func(22,33)55

访问lua的全局变量

>>> defgreeting(name='World'):# greeting someone... print('Hello, {}!'.format(name))>>> lua._G.greeting=greeting>>> lua.execute('greeting()')Hello, World!
>>> lua.execute('greeting("John")')Hello, John!

零拷贝数据共享
>>> poem={... 'the':'quick',... 'brown':'fox',... 'jumps':'over',... }>>> lua_func=lua.eval('''
...     function(poem) -- finish the poem
...         poem['lazy'] = 'doges'
...     end
... ''')>>> lua_func(poem)>>> poem['lazy']'doges'

处理lua表

>>> table=lua.table_from(poem)>>> lua_func=lua.eval('''
...     function(poem) -- shuffle the poem
...         local new_poem = {}
...         for k, v in pairs(poem) do
...             new_poem[v] = k
...         end
...         return new_poem
...     end
... ''')>>> new_poem=lua_func(table)>>> forkinsorted(new_poem):... print(k,new_poem[k],end=' ')doges lazy fox brown over jumps quick the

对于lua用户

简要介绍
ffilupa=require'ffilupa'Fraction=ffilupa.import_module('fractions').Fractiona=Fraction(1,2)b=Fraction(1,3)c=a+b-- c == 5/6

扩展lua的能力
Path=ffilupa.import_module('pathlib').Pathp=Path('.')p=p/'ffilupa'for_,filenameinpairs(p:iterdir())doprint(filename)-- print all filename in ./ffilupaend

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java OpenShift的齿轮特性   java如何在Liferay站点的每个页面上放置公司地址和电话?   java确定整数数组中是否存在一个子集,在两个条件下求和到给定的目标值   序列化为什么java中的serialVersionUID必须是静态的、最终的、长类型的?   java响应返回null   java注入接口实现Quarkus   java我不明白为什么第二次排序的运行时间比第一次慢?   (Java)显示图像的最佳方式?   java Android应用程序因添加布局而崩溃   java如何在运行时获取泛型变量的类   java Selenium web驱动程序:无效的选择器:*:WebKitFullScreenSentor   Spring中的java注入值始终为空   Eclipse中带有TestNG插件的@BeforeSuite和@AfterSuite的java问题   使用trycatch块、filewriter和printwriter在java中创建自定义类   如何在Java 安卓上绘制相交的两条线