我正在加载一个lua脚本,它试图导入第二个lua脚本。问题是,我在Main.lua中加载了初始脚本( C++ ),并指定了到这个Lua的路径,然后当Main.lua试图在"Other.lua“上运行dofile时,它就找不到.
我得到..。
无法打开Other.lua:没有这样的文件或目录
main.cpp
#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
print("Main Loaded");
dofile("Other.lua");Other.lua -存储在与"Main.lua"相同的文件夹中
print("Other Loaded");发布于 2020-08-18 06:14:02
只需将应该从Main.lua加载Other.lua脚本的路径传递给C++,并将其放在文件名的前面,然后在Lua中将其传递给dofile。
发布于 2020-08-20 07:46:31
如果您正在使用LuaRocks,您的配置可能会覆盖lua的path默认配置,这将导致问题(这种情况经常发生,真的)
没有任何关于如何管理这些问题的好指南,随着你对Lua的研究越来越深入,你将面临这样的问题,所以我不得不为你和其他可能经历过这类问题的人写这个。
要解决这个问题,您可以采取许多步骤(嵌套的相对导入可能是纯粹的疯狂)
package.pathpackage.path = package.path .. ';' .. ('./?.lua')
package.path = package.path .. ';' .. ('./?/init.lua')
.是当前目录,?被传递给require()的脚本的名称所取代,这样它也必须强制地在当前目录中搜索。
在某些项目中,您必须管理从嵌套文件夹导入,甚至从后面的文件夹导入。
Lua使管理导入变得特别困难,例如,如果在根文件夹中已经需要的脚本上使用require,则必须从根文件夹开始对要加载的脚本进行索引。
与require(libs.classes.functions.public.dev.MyFunction)不同的是,您也可以这样做:
(...)获取导入路径(仅在Lua5.1和更高版本中)> current_path = (...)将根据相对路径(如果脚本已经嵌套)等于当前脚本的路径。
它将返回类似于以下内容的内容:root.lib.classes.currentscriptname
姓氏将等于使用(...)的脚本名.
(...):match('(.-)[^%.]+$'),这将允许您从当前脚本父目录(即当前脚本所在的文件夹,而不是主脚本位于的位置)导入。因此:BASE = (...):match('(.-)[^%.]+$')和require(BASE .. 'myLib')将从保存当前脚本的文件夹中导入myLib .
例如,假设运行位于main.lua的main/,然后导入位于main/lib/classes的名为loader.lua的脚本,假设要加载两个脚本:
位于main/lib
main/lib/classes的
您可以执行以下操作:
在您的main.lua脚本:
-- 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脚本:
-- 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加载这两个脚本,而不会遇到太多麻烦,并且不会产生不必要的长路径。
https://stackoverflow.com/questions/63462315
复制相似问题