无法从 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
- Lua为您填写
.lua
分机
- 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 用默认路径填充。
我正在尝试使用 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
- Lua为您填写
.lua
分机 - 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 用默认路径填充。