无法从 Windows 中的 Atom Lua 运行 load/require 文件

Unable to load/require file from Lua running from Atom in Windows

我正在尝试使用 Atom 来 运行 一个 Lua 脚本。但是,当我尝试通过 require() 命令加载文件时,它总是说无法找到它们。这些文件都在同一个文件夹中。比如加载utils.lua我试过

require 'utils'
require 'utils.lua'
require 'D:\Users\Mike\Dropbox\Lua Modeling\utils.lua'
require 'D:\Users\Mike\Dropbox\Lua Modeling\utils.lua'
require 'D:/Users/Mike/Dropbox/Lua Modeling/utils.lua'

我收到类似

的错误
Lua: D:\Users\Mike\Dropbox\Lua Modeling\main.lua:12: module 'D:\Users\Mike\Dropbox\Lua Modeling\utils.lua' not found:
    no field package.preload['D:\Users\Mike\Dropbox\Lua Modeling\utils.lua']
    no file '.\D:\Users\Mike\Dropbox\Lua Modeling\utils\lua.lua'
    no file 'D:\Program Files (x86)\Lua.1\lua\D:\Users\Mike\Dropbox\Lua Modeling\utils\lua.lua'
    no file 'D:\Program Files (x86)\Lua.1\lua\D:\Users\Mike\Dropbox\Lua Modeling\utils\lua\init.lua'
    no file 'D:\Program Files (x86)\Lua.1\D:\Users\Mike\Dropbox\Lua Modeling\utils\lua.lua'

消息在第一行表示未找到 'D:\Users\Mike\Dropbox\Lua Modeling\utils.lua',即使那是文件的完整路径。我做错了什么?

谢谢。

简答

您应该可以使用以下代码加载 utils.lua

require("utils")

然后从 utils.lua 所在的目录启动程序:

cd "D:\Users\Mike\Dropbox\Lua Modeling"
lua main.lua

长答案

要了解这里出了什么问题,稍微了解一下 require 的工作原理会很有帮助。 require 做的第一件事是在模块路径中搜索模块。来自 Programming in Lua chapter 8.1:

The path used by require is a little different from typical paths. Most programs use paths as a list of directories wherein to search for a given file. However, ANSI C (the abstract platform where Lua runs) does not have the concept of directories. Therefore, the path used by require is a list of patterns, each of them specifying an alternative way to transform a virtual file name (the argument to require) into a real file name. More specifically, each component in the path is a file name containing optional interrogation marks. For each component, require replaces each ? by the virtual file name and checks whether there is a file with that name; if not, it goes to the next component. The components in a path are separated by semicolons (a character seldom used for file names in most operating systems). For instance, if the path is

?;?.lua;c:\windows\?;/usr/local/lua/?/?.lua

then the call require"lili" will try to open the following files:

lili
lili.lua
c:\windows\lili
/usr/local/lua/lili/lili.lua

从您的错误消息来看,您的 Lua 路径似乎如下:

.\?.lua;D:\Program Files (x86)\Lua.1\lua\?.lua;D:\Program Files (x86)\Lua.1\lua\?\init.lua;D:\Program Files (x86)\Lua.1\?.lua

为了便于阅读,以下是用换行符分隔的每个模式:

.\?.lua
D:\Program Files (x86)\Lua.1\lua\?.lua
D:\Program Files (x86)\Lua.1\lua\?\init.lua
D:\Program Files (x86)\Lua.1\?.lua

从这个列表中你可以看到当调用 require

  1. Lua为您填写.lua分机
  2. Lua剩下的文件路径给你填

换句话说,您应该只指定模块名称,如下所示:

require("utils") 

现在,Lua 还需要知道 utils.lua 文件在哪里。最简单的方法是从 D:\Users\Mike\Dropbox\Lua Modeling 文件夹中 运行 您的程序。这意味着当您 运行 require("utils") 时,Lua 会将第一个模式 .\?.lua 扩展为 .\utils.lua,并且当它检查该路径时,它将找到 utils.lua 当前目录下的文件。

换句话说,运行像这样设置你的程序应该可以工作:

cd "D:\Users\Mike\Dropbox\Lua Modeling"
lua main.lua

另一种选择

如果您不能(或不想)将工作目录更改为 运行 程序,您可以使用 LUA_PATH 环境变量将新模式添加到路径require 用于搜索模块。

set LUA_PATH=D:\Users\Mike\Dropbox\Lua Modeling\?.lua;%LUA_PATH%;
lua "D:\Users\Mike\Dropbox\Lua Modeling\main.lua"

这里有一个小技巧。如果 LUA_PATH 环境变量已经存在,那么这会将您的项目文件夹添加到它的开头。如果 LUA_PATH 不存在,这将在末尾添加 ;;,Lua 用默认路径填充。