gpt4 book ai didi

julia - 如何使 `eval` 使用特定路径来解析 Julia 中的 `include`?

转载 作者:行者123 更新时间:2023-12-04 20:26:29 28 4
gpt4 key购买 nike

这个表达式eval(Meta.parse("begin $(code)\nend"))将使用 include 评估 Julia 代码相对于文件 eval... 解析中定义。

如何更改它以便它使用另一个目录?就像是

eval(Meta.parse("begin $(code)\nend"), resolve_include_relative_to=somepath)

或者,如果这是不可能的 - 相对于当前目录(如 REPL)?

更新

可能的解决方案 - 用绝对路径替换相对路径
function fix_include(code::String, relative_path::String)::String
code = replace(code, r"include\(\"\./(.*?)\"\)" => s"include(\"__relative_path__/\1\")")
code = replace(code, r"__relative_path__" => relative_path)
code
end

eval(Meta.parse("begin $(fix_include(code, relative_path))\nend")

用例:

我正在评估字符串代码片段,有时它们包含 include带有相对路径的语句,它们解决了错误的路径。我想明确指定告诉它应该使用什么路径进行解析。或者至少总是使用当前目录“.”,而不是带有 eval(xxx) 的文件所在的目录。行定义 ./lib/runner.jl .

最佳答案

这个函数应该可以解决问题(include 相对于任务本地存储中的路径,如文档字符串所示):

function eval_at(code; path = "none", mod = Main)
tls = task_local_storage()
hassource = haskey(tls, :SOURCE_PATH)
hassource && (path′ = tls[:SOURCE_PATH])
# setting this is enough for `include` to be correct
tls[:SOURCE_PATH] = path

try
# let's use the three-arg `include_string` here to make sure `@__FILE__`
# etc resolve correctly
return include_string(mod, code, path)
finally
hassource ?
(tls[:SOURCE_PATH] = path′) :
delete!(tls, :SOURCE_PATH)
end
end

用法示例:
julia> pwd()
"/home/pfitzseb/Documents"

julia> isfile("test.jl")
false

julia> include("test.jl")
ERROR: could not open file /home/pfitzseb/Documents/test.jl

julia> eval_at("""include("test.jl")""", path = "/home/pfitzseb/foo.jl")
Main.LogT

julia> eval_at("""@__FILE__""", path = "/home/pfitzseb/foo.jl")
"/home/pfitzseb/foo.jl"

关于julia - 如何使 `eval` 使用特定路径来解析 Julia 中的 `include`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59722703/

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