gpt4 book ai didi

julia - 如何确定 julia 脚本是作为模块包含还是作为脚本运行?

转载 作者:行者123 更新时间:2023-12-04 18:21:04 24 4
gpt4 key购买 nike

我想知道如何在 Julia语言,我可以确定 file.jl作为脚本运行,例如在调用中:

bash$ julia file.jl

它只能在这种情况下启动一个函数 main , 例如。因此我可以使用 include('file.jl') ,而不实际执行函数。

具体来说,我正在寻找类似的答案 in a python question :
def main():
# does something

if __name__ == '__main__':
main()

编辑:
更具体地说,方法 Base.isinteractive (见 here )在使用 include('file.jl') 时没有解决问题从非交互式(例如脚本)环境中。

最佳答案

tl;博士版本:

if !isdefined(:__init__) || Base.function_module(__init__) != MyModule
main()
end

解释:

似乎有些困惑。 Python 和 Julia 在“模块”方面的工作方式非常不同(尽管两者使用相同的术语,但原则上它们是不同的)。

在 python 中,源文件可以是模块也可以是脚本,这取决于您选择“加载”/“运行”它的方式:样板文件的存在是为了通过查询 __name__ 来检测运行源代码的环境。在执行时嵌入模块。例如。如果您有一个名为 mymodule.py 的文件,如果你正常导入它,然后在模块定义中变量 __name__自动设置为值 mymodule ;但如果您将其作为独立脚本运行(实际上是将代码“转储”到“主”模块中), __name__变量是全局范围的变量,即 __main__ .这种差异使您能够检测 python 文件的运行方式,因此您可以在每种情况下采取稍微不同的方式,这正是样板文件所做的。

然而,在 Julia 中,模块被明确定义为代码。运行包含 module 的文件无论您是否执行了 using,声明都会加载该模块或 include ;但是在前一种情况下,如果模块已经在工作区中,则不会重新加载它,而在后一种情况下,就好像您“重新定义”了它一样。

模块可以通过特殊的 __init__() 获得初始化代码函数,其工作是仅在第一次加载模块时运行(例如,通过 using 语句导入时)。所以你可以做的一件事是有一个独立的脚本,你可以 include直接作为独立脚本运行,或 include它在 module 的范围内定义,并让它检测模块特定变量的存在,使其在每种情况下表现不同。但它仍然必须是一个独立的文件,与主模块定义分开。

如果你想让模块做独立脚本不应该做的事情,这很容易:你只需要这样的东西:
module MyModule
__init__() = # do module specific initialisation stuff here
include("MyModule_Implementation.jl")
end

如果你想要相反的情况,你需要一种方法来检测你是否在模块内运行。你可以这样做,例如通过检测是否存在合适的 __init__()功能,属于该特定模块。例如:
### in file "MyModule.jl"
module MyModule
export fun1, fun2;
__init__() = print("Initialising module ...");
include("MyModuleImplementation.jl");
end
### in file "MyModuleImplementation.jl"
fun1(a,b) = a + b;
fun2(a,b) = a * b;

main() = print("Demo of fun1 and fun2. \n" *
" fun1(1,2) = $(fun1(1,2)) \n" *
" fun2(1,2) = $(fun2(1,2)) \n");

if !isdefined(:__init__) || Base.function_module(__init__) != MyModule
main()
end

如果 MyModule作为模块加载, main MyModuleImplementation.jl中的函数不会运行。

如果你运行 MyModuleImplementation.jl作为独立脚本, main函数将运行。

所以这是一种接近你想要的效果的方法;但这与将模块定义文件作为模块或独立脚本运行是非常不同的;我不认为你可以简单地“剥离” module来自代码的指令并在 julia.xml 中以这种方式运行模块的“内容”。

关于julia - 如何确定 julia 脚本是作为模块包含还是作为脚本运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49395820/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com