2014-01-28 7 views
5

Gibt es in Lua eine globale Variable, die den Pfad zu der Datei enthält, die gerade interpretiert wird? So etwas wie Pythons __file__ Variable?Lua globale Variable mit Pfad zur aktuellen Datei?

Ich lief eine schnelle for k, v in pairs(_G) do print(k) end im Interpreter, um zu sehen, ob ich etwas finden konnte. Nur die folgenden Variablen wurden aufgelistet?

string xpcall package tostring print os unpack require getfenv setmetatable next assert tonumber io rawequal collectgarbage getmetatable module rawset math debug pcall table newproxy type coroutine _G select gcinfo pairs rawget loadstring ipairs _VERSION dofile setfenv load error loadfile

Vorschläge, wie Sie den Pfad der Datei, die gerade ausgeführt wird, bekommen?

+1

'print (arg [0])' –

+2

Das wird den Dateinamen zurückgeben, mit dem Lua gestartet wurde, aber es wird nicht die "aktuelle Datei" zurückgeben, die sich mit dem Befehl 'require' ändert. –

+0

Nur ein Hinweis, dass die Tabelle "arg" nur verfügbar ist, wenn ein Skript über den Befehlszeileninterpreter 'lua' ausgeführt wird. –

Antwort

5

Die Debug-Bibliothek verfügt über eine getinfo-Methode, die Sie aufrufen können, die unter anderem die Quelldatei für eine Funktion zurückgeben kann.

local info = debug.getinfo(1,'S'); 
print(info.source); 

, die den Namen der Quelldatei zurückkehren würden (die mit dem Symbol @ beginnen, angibt, es ist ein Dateiname) der Funktion auf der ersten Ebene des Call-Stack. Wenn Sie 1 übergeben, fragen Sie nach Informationen über die aktuelle Funktion. Wenn Sie 0 übergeben, würde es =[C] zurückgeben, da es Informationen über die getinfo-Funktion selbst zurückgeben würde.

Für weitere Informationen besuchen Sie den Programming in Lua Verweis auf der offiziellen Lua Webseite: http://www.lua.org/pil/23.1.html

+5

Das funktioniert völlig, nimmt aber zwei Dinge an: 1) Die 'debug'-Bibliothek ist im Build von Lua verfügbar, auf dem sie läuft. 2) der laufende Code wurde nicht vorkompiliert, wobei die Debug-Information entfernt wurde (z. B. mit "luac -s"). Keines dieser Dinge unterliegt immer der Kontrolle des Drehbuchautors. –

+0

+1 für sehr gültige Punkte sollte ich in meiner ursprünglichen Antwort hingewiesen werden. Danke für die Abklärung! –

+0

Beachten Sie auch, dass Funktionen wie 'loadstring' den Wert auf beliebige Zeichenfolgen setzen können. –

4

In Lua 5.2, wenn ein Skript über require geladen wird, erhält er als Argument des Modulnamen zu require gegeben und den Dateinamen dass require verwendet, um das Skript zu öffnen:

$ cat a.lua 
require"b" 
$ cat b.lua 
print("in b",...) 
$ lua a.lua 
in b b ./b.lua 

In Lua 5.1, nur der Modulname geführt wird, nicht die Dateinamen.

1

Als Reaktion auf die Antwort von lhf:
zu Lua Sein neuer, war ich zunächst verwirrt, was ... gemeint. Stellt sich heraus, es ist ein Vararg genau wie mit ANSI C: https://www.lua.org/manual/5.3/manual.html#3.4. Nach meiner Erfahrung mit lua 5.3, mit

local packageName, packagePath = ... 

hatte mir die Paketnamen als wenn sie in einem benutzten erfordern und den absoluten Dateipfad des Pakets.