如何从C++/C设置全局LUA_PATH变量?
我正在尝试直接从 C/C++ 中设置全局 LUA_PATH 变量,我从我的 iPhone 应用程序中使用 Lua,因此我的路径在不同的应用程序之间会发生变化(每个 iPhone 应用程序在设备上都有一个单独的文件夹)。
我知道我可以通过重新编译带有“固定”路径的 lua 来设置 LUA_PATH,但这不是理想的选择。
(我试图这样做是为了能够从我的 .lua
脚本中使用 require
。)
谁能帮帮我?
原文链接 https://stackoverflow.com/questions/4125971
`` `#include <stdlib.h>`` ```
...
setenv("LUA_PATH", (char*)my_path, 1);
```
...或者类似这样的...
在调用 require
之前,您还可以在 Lua 中更改 package.path
。
我对 iPhone 开发并不太熟悉,但你能在执行应用程序之前设置 LUA_PATH 环境变量吗?
例如,在 Linux 中,我可以编写一个脚本来执行你的二进制文件,就像这样:
export LUA_PATH="foo"
/path/to/executable
Windows 也有类似的批处理文件功能。
如果你真的需要在代码中更改它,除了使用 luaL_loadbuffer 和 lua_pcall 执行 "package.path = blah" 命令之外,我不知道该怎么做。
int setLuaPath(lua_State* L, const char* path)
{
lua_getglobal(L, "package");
lua_getfield(L, -1, "path"); // 从栈顶的 table 中获取 "path" 字段
std::string cur_path = lua_tostring(L, -1); // 从栈顶获取路径字符串
cur_path.append(";"); // 在这里进行路径的修改操作
cur_path.append(path);
lua_pop(L, 1); // 弹出刚刚压入的字符串
lua_pushstring(L, cur_path.c_str()); // 压入新的字符串
lua_setfield(L, -2, "path"); // 在 -2 的 table 中设置 "path" 字段的值为栈顶的值
lua_pop(L, 1); // 弹出栈顶的 package table
return 0; // 完成操作!
}
我还没有测试或编译它。我使用了 http://lua.org/pil 和 http://lua.org/manual/5.1。
ObjC:接着上一个回答,这是在我的情况下有效的。需要添加“/?.lua”来追加路径。
int setLuaPath( NSString* path )
{
lua_getglobal( L, "package" );
lua_getfield( L, -1, "path" ); // 从栈顶的表中获取字段“path”(-1)
NSString * cur_path = [NSString stringWithUTF8String:lua_tostring( L, -1 )]; // 从栈顶获取路径字符串
cur_path = [cur_path stringByAppendingString:@";"]; // 在这里进行路径操作
cur_path = [cur_path stringByAppendingString:path];
cur_path = [cur_path stringByAppendingString:@"/?.lua"];
lua_pop( L, 1 ); // 清除刚刚在第5行推入栈上的字符串
lua_pushstring( L, [cur_path UTF8String]); // 推入新字符串
lua_setfield( L, -2, "path" ); // 将表中的“path”字段设置为栈顶值
lua_pop( L, 1 ); // 清除栈顶的package表
return 0; // 完成!
}
... 将此代码添加到某个位置,例如您打开Lua的地方
// 将Lua的Package.path设置为我们可以找到Lua文件的位置
NSString *luaPath = [[NSBundle mainBundle] pathForResource:@"我任何一个Lua文件的名称" ofType:@"lua"];
setLuaPath([luaPath stringByDeletingLastPathComponent]);
...
你可以通过执行一些 lual_dostring 函数,很容易地在 c++ 中设置LUA_PATH和LUA_CPATH。
luaL_dostring(L, "package.path = package.path .. ';?.lua'");
luaL_dostring(L, "package.cpath = package.cpath .. ';?.dll'");
在调用lual_loadfile()和lau_pcall()函数前,这两行代码会将路径和cpath添加到当前设置中。在这种情况下,我添加了一个指令以在执行本地查找。
我花了几个小时才找到这个解决办法...希望它能帮到你。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我猜这不可能,因为正如你所提到的,出于安全原因,每个 iPhone 应用都存在于它自己的沙盒中。
我认为使用
setenv
只会为当前进程及其子进程设置环境变量。顺便说一句:如果你计划将应用提交到 AppStore,根据我所知,脚本语言/解释器是被你签署的合同禁止的。