J'essaie de définir ma variable globale Lua_Path directement à partir de C / C ++, j'utilise Lua à partir de mes applications iPhone, alors mon chemin a tendance à changer entre les applications (chaque application iPhone dispose d'un dossier séparé de l'appareil). p>
Je sais que je pourrais mettre le Lua_Path en recompilant Lua avec un chemin "fixe", mais c'est assez loin d'être idéal. P>
(J'essaie de le faire pour pouvoir utiliser Quelqu'un pourrait-il m'aider ici? P> besoin code>, de mon
.Lua code> scripts. P>
7 Réponses :
Je suppose que cela ne sera pas possible depuis, comme vous la métimérisez, pour des raisons de sécurité, chaque application iPhone vit dans sa proprebasse de sable. P>
Je pense qu'utiliser Et d'ailleurs: Si vous envisagez de soumettre votre application à l'AppStore (autant que je sache) les langues de script / interprètes sont fobdries par le contrat que vous avez signé. P> setenv code> définira la variable d'environnement uniquement pour le processus en cours et ses enfants. P>
Je crois qu'ils avaient l'habitude d'être interdit mais ne le sont plus.
@ Caadmg2 peut-être j'ai raté quelque chose. Je pense que personne ne lit jamais en détail les changements et ajouts fréquents au contrat
setenv ( "LUA_PATH", (char *)my_path, 1 );
Vous pouvez également modifier package.Path code> in Lua avant d'appeler
exiger code>. p>
Je ne suis pas trop familier avec le développement de l'iPhone, mais pouvez-vous définir la variable Lua_Path env avant d'exécuter votre application?
Par exemple, à Linux, je pourrais écrire un script qui exécute votre binaire comme: P >
export LUA_PATH="foo" /path/to/executable
Ou env lua_path = "foo" / chemin / à / exécutable code>.
Je ne pense pas que Lua_Path est une variable d'environnement.
Ce n'est pas une réponse à la question.
en 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! }
Objc: Suivant de l'autre réponse, voici ce qui fonctionne pour moi. L'Ajout de "/?.lua" est nécessaire.
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]); ...
Cela fonctionne parfaitement, merci. Exactement ce que je cherchais.
Vous pouvez définir le Lua_Path et lua_cpath au sein de C ++ très facilement en exécutant une liste de fonctions LUAL_DOSTRING.
luaL_dostring(L, "package.path = package.path .. ';?.lua'"); luaL_dostring(L, "package.cpath = package.cpath .. ';?.dll'");
J'ai essayé cela, mais lual_dostring code> retour et erreur. Le message que je reçois est
tenter d'indexer une valeur nulle (global 'package') code>
Tourne effectivement que je recevais cette erreur parce que je n'appelais pas lual_openlibs (l) code>. Cette solution fonctionne si le paquet lib est chargé correctement