2010-11-08 32 views
11

Tôi đang cố gắng đặt biến LUA_PATH toàn cầu của mình trực tiếp từ C/C++, tôi đang sử dụng Lua từ các ứng dụng iPhone của mình, vì vậy đường dẫn của tôi có xu hướng thay đổi giữa các ứng dụng (mỗi ứng dụng iPhone có một thư mục riêng trong thiết bị).Đặt biến LUA_PATH toàn cầu từ C++/C?

Tôi biết tôi có thể đặt LUA_PATH bằng cách biên dịch lại lua bằng đường dẫn "cố định", nhưng điều đó khá xa lý tưởng.

(Tôi đang cố gắng để làm điều này để có thể sử dụng require, từ .lua kịch bản của tôi.

bất cứ ai có thể giúp tôi ra khỏi đây?

Trả lời

20

Trong C++:

int setLuaPath(lua_State* L, const char* path) 
{ 
    lua_getglobal(L, "package"); 
    lua_getfield(L, -1, "path"); // get field "path" from table at top of stack (-1) 
    std::string cur_path = lua_tostring(L, -1); // grab path string from top of stack 
    cur_path.append(";"); // do your path magic here 
    cur_path.append(path); 
    lua_pop(L, 1); // get rid of the string on the stack we just pushed on line 5 
    lua_pushstring(L, cur_path.c_str()); // push the new one 
    lua_setfield(L, -2, "path"); // set the field "path" in table at -2 with value at top of stack 
    lua_pop(L, 1); // get rid of package table from top of stack 
    return 0; // all done! 
} 

tôi đã không kiểm tra hoặc biên soạn nó. Tôi đã sử dụng: http://lua.org/pilhttp://lua.org/manual/5.1

0

Tôi đoán đây sẽ không được possibles từ đó, như bạn metioned, vì lý do an ninh mỗi ứng dụng iPhone đang sống trong nó sandbox riêng.

tôi nghĩ rằng sử dụng setenv sẽ thiết lập các biến môi trường chỉ dành cho quá trình hiện tại và đó là trẻ em.

Và nhân tiện: Nếu kế hoạch gửi ứng dụng của bạn tới các ngôn ngữ script/thông dịch viên của AppStore, (theo như tôi biết) sẽ bị bỏ qua bởi hợp đồng bạn đã ký.

+1

Tôi tin rằng họ đã từng bị cấm nhưng không còn nữa. – Puppy

+0

@ DeadMG2 Có lẽ tôi đã bỏ lỡ điều gì đó. Tôi nghĩ rằng không ai từng đọc chi tiết những thay đổi thường xuyên và bổ sung cho hợp đồng – Kai

0
#include <stdlib.h> 

...

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

... hoặc một cái gì đó như thế ...

+1

Tôi không chắc chắn nếu nó hoạt động trên iPhone mặc dù. – onemasse

3

Bạn cũng có thể thay đổi package.path trong Lua trước khi gọi require.

0

Tôi không quá quen thuộc với việc phát triển iPhone, nhưng bạn có thể đặt biến LUA_PATH env trước khi thực hiện ứng dụng của mình không?

Ví dụ, trong Linux, tôi có thể viết một kịch bản thực thi nhị phân của bạn như sau:

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

Windows có chức năng tương tự với các tập tin batch.

Nếu bạn thực sự cần phải thay đổi nó trong mã, tôi không biết làm thế nào để làm điều đó ngắn bằng cách sử dụng luaL_loadbuffer và lua_pcall để thực thi một lệnh "package.path = blah".

+1

Hoặc 'env LUA_PATH =" foo "/ path/to/executable'. – lhf

+0

Tôi không nghĩ LUA_PATH là biến môi trường. – Watusimoto

+0

@Watusimoto http://www.lua.org/pil/8.1.html. Grep LUA_PATH. – lhumongous

4

ObjC: Sau câu trả lời khác, dưới đây là những gì phù hợp với tôi. Việc thêm "/?.lua" là cần thiết.

 
int setLuaPath(NSString* path) 
{ 
    lua_getglobal(L, "package"); 
    lua_getfield(L, -1, "path"); // get field "path" from table at top of stack (-1) 
    NSString * cur_path = [NSString stringWithUTF8String:lua_tostring(L, -1)]; // grab path string from top of stack 
    cur_path = [cur_path stringByAppendingString:@";"]; // do your path magic here 
    cur_path = [cur_path stringByAppendingString:path]; 
    cur_path = [cur_path stringByAppendingString:@"/?.lua"]; 
    lua_pop(L, 1); // get rid of the string on the stack we just pushed on line 5 
    lua_pushstring(L, [cur_path UTF8String]); // push the new one 
    lua_setfield(L, -2, "path"); // set the field "path" in table at -2 with value at top of stack 
    lua_pop(L, 1); // get rid of package table from top of stack 
    return 0; // all done! 
} 

    ... add this code somewhere, near where you lua_open() for example 

    // Set Lua's Package.path to where our Lua files can be found 
    NSString *luaPath = [[NSBundle mainBundle] pathForResource:@"name of any one of my lua files" ofType:@"lua"]; 
    setLuaPath([luaPath stringByDeletingLastPathComponent]); 
    ... 
+0

Công trình này hoàn hảo, cảm ơn bạn. Chính xác những gì tôi đang tìm kiếm. – codeshaman

2

Bạn có thể đặt LUA_PATH và LUA_CPATH trong C++ rất dễ dàng bằng cách thực hiện một vài hàm lual_dostring.

luaL_dostring(L, "package.path = package.path .. ';?.lua'"); 
luaL_dostring(L, "package.cpath = package.cpath .. ';?.dll'"); 

Hai dòng gọi là sau khi bạn có lua_State của bạn (L ở đây) và trước lual_loadfile của bạn() và lau_pcall() gọi hàm sẽ thêm vào con đường hiện thiết lập và cpath. Trong trường hợp này tôi thêm vào cả một lệnh để xem cục bộ để thực thi.

Tôi mất nhiều giờ để tìm giải pháp này .. Tôi hy vọng điều đó sẽ hữu ích.