Julia不像其他语言一样使用shell running external programs。如何在朱莉娅中完成cd temp_dir && some_cmd
的等效操作?据我所知cd()
全局更改工作目录,如果我并行执行代码块,则会出现问题。
答案 0 :(得分:1)
查看cd
函数的文档字符串:
help?> cd
search: cd Cdouble gcd gcdx secd vecdot asecd cld Cmd codeunit CodeInfo
cd(dir::AbstractString=homedir())
Set the current working directory.
cd(f::Function, dir::AbstractString=homedir())
Temporarily changes the current working directory and applies function f
before returning.
我们可以将cd
的第二种方法用于目录,运行命令,然后继续执行。
julia> cd(readdir, "temp_dir/")
2-element Array{String,1}:
"code.jl"
"file.txt"
julia> cd("temp_dir/") do
mkdir("subdir")
end
julia> cd(readdir, "temp_dir/")
3-element Array{String,1}:
"code.jl"
"file.txt"
"subdir"
我们可以将任何函数作为第一个参数传递,包括自定义函数(使用do
块简洁地编写)。
答案 1 :(得分:0)
可以安全地用于并发任务的选项是setenv(cmd, dir=some_working_dir)
。这将创建一个Cmd
对象,该对象将在子进程中获得some_working_directory
,而不会干扰Julia会话中的工作目录。
例如,
julia> run(setenv(`ls`, dir="temp_dir"))
code.jl file.txt
Process(setenv(`ls`; dir="temp_dir"), ProcessExited(0))
答案 2 :(得分:0)
我想出了一个让 shell 用户开心的方法。
随便写
run(`bash -c """cd temp_dir && some_cmd"""`)
我们很好!
这种方法的好处是这些子壳是独立的。例如,我想要一个外部程序来为我生成力场,就像在分子动力学模拟中一样。我需要生成一种逐点数据的基调。我会并行编写它(使用 Threads
)。 Julia 中的 cd
函数会以某种方式更改所有线程的工作目录,而在上面给出的解决方案中,它是线程安全的。