Lua中检测脚本是否被导入或执行

浮头鱼

在python中,有一个通用的表单构造if __name__ == "__main__":来检测文件是导入的还是直接执行的。通常,在此条件中采取的唯一操作是执行一些“合理的顶级”函数。这允许将同一文件用作基本脚本和库模块(以及交互式用户可以导入和使用的内容)。

我想知道在 lua 中是否有一种干净可靠的方法来做到这一点。我以为我可以使用 _REQUIREDNAME 全局变量,但事实证明这在 Lua 5.1 中发生了变化。目前,luarequire传递参数(在可变参数中...),因此原则上可以检查这些参数。但是,这要么不可靠,要么不干净,或者可能两者兼而有之,因为显然在执行脚本时可以传递参数。因此,要安全地执行此操作,您必须检查参数。

FWIW,require将模块名称作为参数 1(您调用的字符串require传递并将其最终找到的文件的路径作为参数 2 传递。因此,显然可以进行一些检查来尝试检测这一点,如果没有if __name__ == "__main__":通过向脚本传递两个适当构造的参数,几乎与用户一样好并且总是可以绕过。不完全是安全威胁,但我希望有更好的解决方案。

我还尝试了另一种方法,我发现它非常丑陋但很有前途。这是为了使用debug.traceack(). 如果直接执行脚本的话,traceback是非常可预测的,实际上只有3行。我认为这可能就是这样,虽然,就像我说的,肯定是一个丑陋的黑客。

有没有更频繁的lua用户有建议?实际上,如果我正在编写模块 X,我想return X.main_func()在脚本模式或return X导入模式下。

编辑:我取出了一个实际上不正确的项目(并使我的追溯解决方案可行)。此外,Egor Skriptunoff 在评论中提供的链接确实提供了调试库中的另一个技巧,它比使用回溯更清晰。除此之外,似乎每个人都遇到了和我一样的问题,而且 lua 团队对提供官方支持这一点并不感兴趣。

浮头鱼

根据 Egor 提供的链接,目前最干净、最安全的方法似乎如下所述:

如何确定我的代码是否在 lua 模块中运行?

为了便于参考,我重复一遍:

if pcall(debug.getlocal, 4, 1) then
  print("in package")
else
  print("in main script")
end

这里有一个完整的主题:

http://lua.2524044.n2.nabble.com/Modules-with-standalone-main-program-td7681497.html

就像我说的,这似乎是一个流行的功能,暂时将不受支持,但 debug.getlocal 方法似乎是普通 lua 开发人员目前已经确定的方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章