国际访客建议访问 Primers 编程伙伴 国际版站点 > Lua 教程 > package-module 以获得更好的体验。

# Lua 的 Package 模块

请查看 Lua 标准库模块列表 了解更多相关 API。
变量 说明
package.config) 包的配置字符串
package.cpath) require 搜索 C 加载器的路径
package.path) require 搜索 Lua 加载器的路径
package.loaded) 已经加载的模块列表
package.preload) 用于存储特定模块的加载器的表
package.searchers) 用于控制 require 如何查找模块的表
函数 说明
package.loadlib) 导入 C 库中的函数
package.searchpath) 查找名称

# package.config

package.config 是编译时决定的包模块配置字符串:

  • 第一行是目录分隔符;Windows 系统默认为 "\",其它系统默认为 "/"

  • 第二行是路径模板分隔符;默认为 ";"

  • 第三行是路径模板替换字符;默认为 "?"

  • 第四行是在 Windows 系统上查找模块时替换为可执行文件所在目录的字符;默认为 "!"

  • 第五行是 luaopen_ 函数名末尾被忽略部分的开始字符;默认为 "-",例如 luaopen_MyLib-2.0

# package.cpath

package.cpathrequire 函数搜索 C 加载器使用的路径列表。

示例值:

/usr/local/lib/lua/5.4/?.so;/usr/local/lib/lua/5.4/loadall.so;./?.so

# package.loaded

package.loaded 是已经加载的模块列表。

示例值:

os              table: 0x1d320
package         table: 0x1cbc8
io              table: 0x1d558
coroutine       table: 0x1d130
debug           table: 0x1ca10
table           table: 0x1d388
utf8            table: 0x1c858
math            table: 0x1e878
string          table: 0x1e198
_G              table: 0x1bb98

# package.path

package.pathrequire 函数搜索 Lua 加载器使用的路径列表。

示例值:

/usr/local/share/lua/5.4/?.lua;/usr/local/share/lua/5.4/?/init.lua;/usr/local/lib/lua/5.4/?.lua;/usr/local/lib/lua/5.4/?/init.lua;./?.lua;./?/init.lua

# package.preload

package.preload 是构建时配置的模块加载器列表,默认是空的。

# package.searchers

模块的查找器函数列表,默认为:

  1. 第一个查找器尝试从 package.preload 中查找加载器 package.preload[modname]

  2. 第二个查找器尝试从 package.path 中查找 Lua 库形式的加载器

  3. 第三个查找器尝试从 package.cpath 中查找 C 库形式的加载器

    • require("mylibs") 尝试加载 mylibs.so 中的 luaopen_mylibs 函数

  4. 第四个查找器尝试使用一体化加载器(多个子模块集成在一个 C 库中):从 package.cpath 中查找 C 库形式的加载器

    • require("mylibs.xx") 尝试加载 mylibs.so 中的 luaopen_mylibs_xx 函数

    • require("mylibs.yy") 尝试加载 mylibs.so 中的 luaopen_mylibs_yy 函数

    • require("mylibs.zz") 尝试加载 mylibs.so 中的 luaopen_mylibs_zz 函数

# package.loadlib

package.loadlib (libname, funcname)

!subtitle:说明

动态链接 C 库 libname,查找函数 funcname 并将其作为 lua_CFunction 返回。

如果 funcname"*",则仅动态链接 C 库 libname,从而使器导出的符号可以被使用。

typedef int (*lua_CFunction) (lua_State *L);

!subtitle:参数

  • libname - 要链接的动态库名称(完整文件名,不可省略扩展名)

  • funcname - 要加载的函数名(完整符号,不可省略 lua_open 前缀)

!subtitle:返回值

  • 返回加载的 C 函数

# package.searchpath

package.searchpath (name, path [, sep [, rep]])

!subtitle:说明

在路径 path 中查找名称 name

路径 path 是一个字符串,包含一系列以分号(;,受 package.config 影响)分隔的路径模板,用于生成路径:

  • 路径模板中的问号(?,受 package.config 影响)会被替换为 name

  • name 中的 sep(默认为 .)会被替换为 rep(默认为系统路径分隔符)

然后尝试以读模式打开生成的路径。

例如 path"./?.lua;./?.lc;/usr/local/?/init.lua"namemodule.sub,将依次尝试打开:

  • "./module/sub.lua"

  • "./module/sub.lc"

  • "/usr/local/module/sub/init.lua"

!subtitle:参数

  • name - 要查找的名称

  • path - 查找的路径模板

  • sep - 名称 name 中的分隔符,生成路径时会被替换为 rep;默认为 "."

  • rep - 生成路径时替换 sep 的字符;Windows 系统默认为 "\",其它系统默认为 "/"

!subtitle:返回值

  • 成功时返回第一个成功的文件路径

  • 失败时返回 nil 和错误消息

# 关联文档

# 推荐阅读

本文 更新于: 2025-11-27 09:38:13 创建于: 2025-11-27 09:38:13