我有一个输入文件,其中定义了一些变量。对于循环中的每次迭代,我想读取文件,更新一些变量的值,然后运行计算。
我有一个名为input.jl的输入文件
myval=1
然后我有一个带有以下命令的文件myscript.jl
for i=1:2
include("input.jl")
println(myval)
myval=2
end
如果我运行该文件(julia myscript.jl),则会收到myval
未定义的错误。如果我注释掉第三行或第四行,那么它运行没有问题。如果我删除for循环,三行运行没有问题。如何从input.jl中读取myval
,使用它,然后在循环的每次迭代期间更新其值?
答案 0 :(得分:1)
不幸的是,似乎include
函数在全局范围内执行事物,然后从它停止的地方继续。因此,如果您尝试将新变量动态include
放入本地范围,则不是这样做的。
您可以在全局范围首先引入变量,以便该函数可以访问它,因此赋值将起作用(但是,请注意该变量将在全球范围)。
或
您可以先将输入文件包装到模块中作弊。您仍然需要按名称调用变量,并且您将收到有关更新模块的警告,但这样您至少可以动态更新本地变量,而无需在全局范围内使用该变量: / p>
# in input.jl
module Input
myval = 1;
end
# in your main file
for i=1:2
include("input.jl")
myval = Input.myval;
println(myval)
myval=2
end
或
您可以添加一个单独的流程并将计算卸载到其全局范围,并在本地将其检索到当前流程,例如。
# in file input.jl
myval = 1
# in main file
addprocs(1);
for i=1:2
myval = remotecall_fetch(() -> (global myval; include("input.jl"); myval), 2);
println(myval)
myval=2
end