获取Lua的当前工作目录

16 lua windows-xp getcwd

Lua在Windows XP SP3上获取当前工作目录(或获取当前运行的Lua文件的目录)是什么?我不想使用LuaFileSystem.

我无法使用os.execute("cd")因为os.execute总是从我的主目录开始(因此总是产生C:\Documents and Settings\username).

jpj*_*obs 16

也许有些丑陋的黑客喜欢

current_dir=io.popen"cd":read'*l'
Run Code Online (Sandbox Code Playgroud)

  • 不, os.execute'cd' 只打印输出,而 io.popen 捕获它,并将其放入 current_dir 变量中 (3认同)

kik*_*ito 8

默认情况下,Lua没有"本地"方式支持"当前目录"的概念,或者实际上是"目录"的概念.

获取当前目录的正确方法是使用提供文件夹支持的库.有几个 - 我推荐luafilesystem.

安装完成后,您可以通过执行以下命令获取当前目录:

lfs.currentdir()
Run Code Online (Sandbox Code Playgroud)

这将适用于Windows,Linux和Mac.

请注意,这些外部库通常涉及一些二进制包.根据您的设置,您可能必须先编译它才能使用它.

编辑:

请注意,当包含文件时require,表达式{...}[1]将返回require指令使用的路径.它不完全是路径,因为:

  • 它使用点来分隔目录并.lua压缩文件的末尾.
  • 它与lua进程初始化的路径有关
  • 这取决于配置 package.path

但是如果您需要的只是文件的"需要类似路径"(可能需要它旁边的文件),那么您可以通过在文件的最开头执行此操作来获取它:

local PATH = (...):match("(.+)%.[^%.]+$") or (...)
Run Code Online (Sandbox Code Playgroud)

如果baz.lua需要调用一个文件require 'foo.bar.baz',那么PATH将是foo.bar.


ary*_*ryu 7

您应该能够获得当前运行的lua文件路径:

debug.getinfo(1).short_src;
Run Code Online (Sandbox Code Playgroud)

要么

debug.getinfo(1).source;
Run Code Online (Sandbox Code Playgroud)

然后使用正则表达式的当前目录:

string.gsub(debug.getinfo(1).short_src, "^(.+\\)[^\\]+$", "%1");
Run Code Online (Sandbox Code Playgroud)

编辑:实际上只有在你用完整路径运行你的lua时才有效.例如:"lua.exe C:\ test\test.lua"而不是"lua.exe test.lua"

  • 在Linux中,我不得不使用`debug.getinfo(1).source`并将正则表达式更改为`string.gsub(debug.getinfo(1).source,“ ^ @(。+ /)[^ /] + $” ,“%1”)`。 (2认同)

Ada*_*dam 6

我还没有时间测试这个,但是你尝试过os.getenv来读取 Windows 环境变量吗?

Windows 有一个当前目录的环境变量:%CD%

os.getenv("CD")
Run Code Online (Sandbox Code Playgroud)

编辑:在 Windows 7 上测试,当其他环境变量起作用时(即 %USERNAME% 或 %PROGRAMFILES%),CD var 返回 nil

  • %CD%不是进程环境变量,它是由shell提供的,所以不起作用 (3认同)