Юлия: создайте новую папку и файл в расположении относительно расположения скрипта - PullRequest
1 голос
/ 18 марта 2019

Вы случайно не знаете, как найти путь сценария julia в сценарии julia?

По сути, я создал скрипт julia с именем someCode.jl, и он находится в папке с именем repository.

Когда я запускаю someCode.jl, я хотел бы создать выходную папку с именем output в папке repository и поместить файл a.txt в папку output.

С абсолютным путем он работает нормально, но я хочу, чтобы он работал для людей, которые поставили его по другому пути, но я пока не смог найти правильный синтаксис.

Попытка

Команда pwd() возвращает каталог, в котором установлена ​​julia, в данном случае это: "E:\\Users\\a\\AppData\\Local\\Julia-1.1.0" Следовательно, я должен либо убедиться, что текущий путь обновляется в папку, в которой находится скрипт, когда я его запускаю или получить местоположение самого скрипта в коде скрипта. Ни один из подходов еще не был успешным в Юлии. REPL.

MWE:

Это пример файла someCode.jl, я запускаю его, открыв Julia REPL и введя: include("E:/someCode.jl")

open("c:/repository/output/a.txt", "w") do f
    n1 = "Content of  first line"
    write(f, "$n1")
end

Если хранилище или выходная папка еще не существуют, выдается ошибка:

ERROR: LoadError: SystemError: opening file "c:/repository/output/a.txt": No such file or directory
Stacktrace:
 [1] #systemerror#43(::Nothing, ::Function, ::String, ::Bool) at .\error.jl:134
 [2] systemerror at .\error.jl:134 [inlined]
 [3] #open#309(::Nothing, ::Nothing, ::Nothing, ::Bool, ::Nothing, ::Function, ::String) at .\iostream.jl:283
 [4] #open at .\none:0 [inlined]
 [5] open(::String, ::String) at .\iostream.jl:339
 [6] #open#310(::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}, ::Function, ::getfield(Main, Symbol("##7#8")), ::String, ::Vararg{String,N} where N) at .\iostream.jl:367
 [7] open(::Function, ::String, ::String) at .\iostream.jl:367
 [8] top-level scope at none:0
 [9] include at .\boot.jl:326 [inlined]
 [10] include_relative(::Module, ::String) at .\loading.jl:1038
 [11] include(::Module, ::String) at .\sysimg.jl:29
 [12] include(::String) at .\client.jl:403
 [13] top-level scope at none:0
in expression starting at E:\someCode.jl:1

Итак, я убедился, что папки c:/repository/output существуют, поместил второй скрипт в файл с именем 'someLocalCode.jl and ran it with include ("C: /repository/someLocalCode.jl") `:

open("c:/repository/output/a.txt", "w") do f
    n1 = "Content of  first line"
    write(f, "$n1")
end

open("output/b.txt", "w") do f
    n1 = "Content of  first line"
    write(f, "$n1")
end

open("/output/b.txt", "w") do f
    n1 = "Content of  first line"
    write(f, "$n1")
end

#include("C:/repository/test.jl")

Оба output/b.txt и /output/b.txt дают (в сущности) одну и ту же сущность при индивидуальном тестировании:

ERROR: LoadError: SystemError: opening file "/output/b.txt": No such file or directory
Stacktrace:
 [1] #systemerror#43(::Nothing, ::Function, ::String, ::Bool) at .\error.jl:134
 [2] systemerror at .\error.jl:134 [inlined]
 [3] #open#309(::Nothing, ::Nothing, ::Nothing, ::Bool, ::Nothing, ::Function, ::String) at .\iostream.jl:283
 [4] #open at .\none:0 [inlined]
 [5] open(::String, ::String) at .\iostream.jl:339
 [6] #open#310(::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}, ::Function, ::getfield(Main, Symbol("##15#16")), ::String, ::Vararg{String,N} where N) at .\iostream.jl:367
 [7] open(::Function, ::String, ::String) at .\iostream.jl:367
 [8] top-level scope at none:0
 [9] include at .\boot.jl:326 [inlined]
 [10] include_relative(::Module, ::String) at .\loading.jl:1038
 [11] include(::Module, ::String) at .\sysimg.jl:29
 [12] include(::String) at .\client.jl:403
 [13] top-level scope at none:0
in expression starting at C:\repository\someLocalCode.jl:6

Принимая во внимание, что абсолютный путь работает.

Ответы [ 2 ]

2 голосов
/ 18 марта 2019

Вот варианты:

  • @__DIR__ макрос, расширяющийся до строки с абсолютным путем к каталогу файла, содержащего макросов
  • @__FILE__ макрос, расширяющийся до строки с путем к файлу, содержащему макросов
  • PROGRAM_FILE константа, содержащая имя скрипта, переданное Юлии из командной строки
0 голосов
/ 18 марта 2019

Большое спасибо @Bogumil, реализованный в примере скрипта, ответ может быть таким:

# Run this script with the following command:
#include("C:/repository/someCode.jl")

# Print output file to absolute location:
open("c:/repository/output/a.txt", "w") do f
    n1 = "Content of  first line"
    write(f, "$n1")
end

# See what the commands do:
println(@__DIR__)
println(@__FILE__)
println("PROGRAM_FILE=", PROGRAM_FILE)

# Concatenate/merge the local directory with the relative output file location
directoryPath = string(@__DIR__, "/output/b.txt")
println("directoryPath concatenation=", directoryPath)

# Write the output file to a relative file location
open(directoryPath, "w") do f
    n1 = "Content of  first line"
    write(f, "$n1")
end
...