2010-11-08 4 views
11

मैं अपने ग्लोबल LUA_PATH वैरिएबल को सी/सी ++ से सीधे सेट करने की कोशिश कर रहा हूं, मैं अपने आईफोन अनुप्रयोगों से लुआ का उपयोग कर रहा हूं, इसलिए मेरा पथ बदलता है एप्लिकेशन के बीच बदलता है (प्रत्येक आईफोन ऐप में डिवाइस में एक अलग फ़ोल्डर होता है)।सी ++/सी से वैश्विक LUA_PATH चर सेट करना?

मुझे पता है कि मैं "निश्चित" पथ के साथ लुआ को पुन: संकलित करके LUA_PATH सेट कर सकता हूं, लेकिन यह आदर्श से काफी दूर है।

(मैं, क्रम में require उपयोग करने के लिए, मेरे .lua स्क्रिप्ट से सक्षम होने के लिए।

किसी को भी मुझे बाहर यहाँ मदद कर सकता है?

उत्तर

20

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! 
} 

मैं परीक्षण किया है या यह संकलित नहीं किया है। मैंने प्रयोग किया: http://lua.org/pil और http://lua.org/manual/5.1

0

मुझे लगता है कि इस के बाद से possibles नहीं होगा यह करने के लिए कोशिश कर रहा हूँ के रूप में आप metioned, सुरक्षा कारणों से प्रत्येक iPhone ऐप्लिकेशन यह खुद सैंडबॉक्स में रहती है।

मैं setenv का उपयोग कर केवल वर्तमान प्रक्रिया के लिए वातावरण चर सेट हो जाएगा लगता है और यह बच्चों के लिए।

और वैसे: यदि ऐपस्टोर में अपना ऐप सबमिट करने की योजना है, (जहां तक ​​मुझे पता है) स्क्रिप्ट भाषा/दुभाषिया आपके द्वारा हस्ताक्षरित अनुबंध द्वारा निषिद्ध हैं।

+1

मुझे विश्वास है कि वे वर्जित थे लेकिन अब नहीं हैं। – Puppy

+0

@ DeadMG2 शायद मुझे कुछ याद आया। मुझे लगता है कि कोई भी कभी भी – Kai

0
#include <stdlib.h> 

...

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

... या ऐसा ही कुछ ...

+1

अनुबंध में लगातार परिवर्तन और जोड़ों को विस्तार से पढ़ता नहीं है, मुझे यकीन नहीं है कि यह आईफोन पर काम करता है या नहीं। – onemasse

3

तुम भी require कॉल करने से पहले लुआ में package.path बदल सकते हैं।

0

मैं आईफोन विकास से बहुत परिचित नहीं हूं, लेकिन क्या आप अपने आवेदन को निष्पादित करने से पहले LUA_PATH env चर सेट कर सकते हैं?

उदाहरण के लिए, लिनक्स में, मैं एक स्क्रिप्ट है कि इतनी की तरह अपने द्विआधारी कार्यान्वित लिख सकते हैं:

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

विंडोज बैच फ़ाइलों के साथ इसी तरह की सुविधा है।

यदि आपको वास्तव में कोड में इसे बदलने की ज़रूरत है, तो मुझे नहीं पता कि luaL_loadbuffer और lua_pcall को "package.path = blah" कमांड निष्पादित करने के लिए कम से कम कैसे करें।

+1

या 'env LUA_PATH =" foo "/ path/to/execable'। – lhf

+0

मुझे नहीं लगता कि LUA_PATH एक पर्यावरण चर है। – Watusimoto

+0

@ वाटसिमोटो http://www.lua.org/pil/8.1.html। Grep LUA_PATH। – lhumongous

4

ओबीजेसी: दूसरे उत्तर के बाद, यहां मेरे लिए क्या काम करता है। "/?.lua" को जोड़ने की आवश्यकता है।

 
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

यह बेकार ढंग से काम करता है, धन्यवाद। ठीक वही जो मेरे द्वारा खोजा जा रहा था। – codeshaman

2

आप कार्यों lual_dostring एक जोड़े को क्रियान्वित करते हुए ++ बहुत आसानी से ग भीतर LUA_PATH और LUA_CPATH सेट कर सकते हैं।

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

इन दो लाइन आप अपने lua_State (यहाँ एल) और अपने lual_loadfile से पहले() और lau_pcall है के बाद कहा जाता है() फ़ंक्शन कॉल वर्तमान में सेट पथ और cpath को जोड़ना होगा। इस मामले में मैं निष्पादन के लिए स्थानीय देखने के लिए दोनों निर्देशों को जोड़ता हूं।

मुझे इस समाधान को खोजने में मुझे घंटे लगे .. मुझे उम्मीद है कि इससे मदद मिलती है।