如何从C++/C设置全局LUA_PATH变量?

我正在尝试直接从 C/C++ 中设置全局 LUA_PATH 变量,我从我的 iPhone 应用程序中使用 Lua,因此我的路径在不同的应用程序之间会发生变化(每个 iPhone 应用程序在设备上都有一个单独的文件夹)。

我知道我可以通过重新编译带有“固定”路径的 lua 来设置 LUA_PATH,但这不是理想的选择。

(我试图这样做是为了能够从我的 .lua 脚本中使用 require。)

谁能帮帮我?

原文链接 https://stackoverflow.com/questions/4125971

点赞
stackoverflow用户478370
stackoverflow用户478370

我猜这不可能,因为正如你所提到的,出于安全原因,每个 iPhone 应用都存在于它自己的沙盒中。

我认为使用 setenv 只会为当前进程及其子进程设置环境变量。

顺便说一句:如果你计划将应用提交到 AppStore,根据我所知,脚本语言/解释器是被你签署的合同禁止的。

2010-11-08 17:31:00
stackoverflow用户492716
stackoverflow用户492716
`` `#include <stdlib.h>`` ```

...

setenv("LUA_PATH", (char*)my_path, 1);

```

...或者类似这样的...

2010-11-08 17:32:28
stackoverflow用户107090
stackoverflow用户107090

在调用 require 之前,您还可以在 Lua 中更改 package.path

2010-11-08 18:01:24
stackoverflow用户304608
stackoverflow用户304608

我对 iPhone 开发并不太熟悉,但你能在执行应用程序之前设置 LUA_PATH 环境变量吗?

例如,在 Linux 中,我可以编写一个脚本来执行你的二进制文件,就像这样:

export LUA_PATH="foo"
/path/to/executable

Windows 也有类似的批处理文件功能。

如果你真的需要在代码中更改它,除了使用 luaL_loadbuffer 和 lua_pcall 执行 "package.path = blah" 命令之外,我不知道该怎么做。

2010-11-08 19:49:39
stackoverflow用户156521
stackoverflow用户156521
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/pilhttp://lua.org/manual/5.1

2010-11-11 15:26:52
stackoverflow用户434004
stackoverflow用户434004

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]);
   ...
2011-04-01 22:10:56
stackoverflow用户5377055
stackoverflow用户5377055

你可以通过执行一些 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添加到当前设置中。在这种情况下,我添加了一个指令以在执行本地查找。

我花了几个小时才找到这个解决办法...希望它能帮到你。

2017-03-07 03:20:50