首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何相对于当前加载的脚本加载lua脚本?

如何相对于当前加载的脚本加载lua脚本?
EN

Stack Overflow用户
提问于 2020-08-18 05:22:22
回答 2查看 940关注 0票数 0

我正在加载一个lua脚本,它试图导入第二个lua脚本。问题是,我在Main.lua中加载了初始脚本( C++ ),并指定了到这个Lua的路径,然后当Main.lua试图在"Other.lua“上运行dofile时,它就找不到.

我得到..。

无法打开Other.lua:没有这样的文件或目录

main.cpp

代码语言:javascript
复制
#include "sol.hpp"
int main()
{
      sol::state m_lua;
      m_lua.open_libraries(sol::lib::base);
      sol::protected_function_result result = m_lua.script_file("../../../Desktop/Main.lua");
      if (!result.valid())
      {
         sol::error err = result;
         std::string what = err.what();
         std::cout << "Failed to load script: Test.lua - " << what << std::endl;
      }
   }
}

Main.lua

代码语言:javascript
复制
print("Main Loaded");
dofile("Other.lua");

Other.lua -存储在与"Main.lua"相同的文件夹中

代码语言:javascript
复制
print("Other Loaded");
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-18 06:14:02

只需将应该从Main.lua加载Other.lua脚本的路径传递给C++,并将其放在文件名的前面,然后在Lua中将其传递给dofile

票数 1
EN

Stack Overflow用户

发布于 2020-08-20 07:46:31

如果您正在使用LuaRocks,您的配置可能会覆盖lua的path默认配置,这将导致问题(这种情况经常发生,真的)

没有任何关于如何管理这些问题的好指南,随着你对Lua的研究越来越深入,你将面临这样的问题,所以我不得不为你和其他可能经历过这类问题的人写这个。

要解决这个问题,您可以采取许多步骤(嵌套的相对导入可能是纯粹的疯狂)

  1. 您可以简单地将当前路径分配给package.path

package.path = package.path .. ';' .. ('./?.lua')

package.path = package.path .. ';' .. ('./?/init.lua')

.是当前目录,?被传递给require()的脚本的名称所取代,这样它也必须强制地在当前目录中搜索。

在某些项目中,您必须管理从嵌套文件夹导入,甚至从后面的文件夹导入。

Lua使管理导入变得特别困难,例如,如果在根文件夹中已经需要的脚本上使用require,则必须从根文件夹开始对要加载的脚本进行索引。

require(libs.classes.functions.public.dev.MyFunction)不同的是,您也可以这样做:

  1. 如果脚本是从已经嵌套的脚本导入的,则可以在脚本根目录中使用(...)获取导入路径(仅在Lua5.1和更高版本中)

> current_path = (...)将根据相对路径(如果脚本已经嵌套)等于当前脚本的路径。

它将返回类似于以下内容的内容:root.lib.classes.currentscriptname

姓氏将等于使用(...)的脚本名.

  1. 如果要从脚本当前文件夹导入,请使用(...):match('(.-)[^%.]+$'),这将允许您从当前脚本父目录(即当前脚本所在的文件夹,而不是主脚本位于的位置)导入。

因此:BASE = (...):match('(.-)[^%.]+$')require(BASE .. 'myLib')将从保存当前脚本的文件夹中导入myLib .

例如,假设运行位于main.luamain/,然后导入位于main/lib/classes的名为loader.lua的脚本,假设要加载两个脚本:

位于main/lib

  • bullet.lua,位于main/lib/classes

  1. assets.lua

您可以执行以下操作:

在您的main.lua脚本:

代码语言:javascript
复制
-- main.lua
-- From Lua 5.1 and above

-- Since this script is not nested
-- this will only contain the name of the current script (without '.lua'), which is "main"
local CURRENT_PATH = (...) 

LIBS_PATH = CURRENT_PATH .. '.lib' -- This will hold "main.lib"

在您的loader.lua脚本:

代码语言:javascript
复制
-- loader.lua
-- From Lua 5.1 and above

-- This will contain "main.lib.classes.", which already has a dot at the end
local CURRENT_PATH = (...):match('(.-)[^%.]+$')

-- SCRIPT_PATH will contain "main.lib.classes.loader"
local SCRIPT_PATH = (...)

-- Import from main/lib/assets.lua
local assets = require(LIB_PATH .. '.assets')
-- Import from current directory (main/lib/classes)
local bullet = require(BASE .. 'assets')

这将使您能够从loader.lua加载这两个脚本,而不会遇到太多麻烦,并且不会产生不必要的长路径。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63462315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档