Julia:从命令行将任意长度的数组传递给脚本
Julia: pass Array of arbitrary length to script from command line
ARGS 关键字允许在从命令行调用 Julia 脚本时指定参数(请参阅 Access command line arguments in Julia)。这样,命令行调用中的每个 space 都在 ARGS 数组中标记一个单独的元素。如果我希望这些元素之一本身是任意长度的数组怎么办?只是连接 ARGS 的单独元素在这里似乎不合适。
这里有两个键。
- 请注意,您从命令行传递给脚本的任何内容最初都是一个字符串。在脚本中使用
eval(parse( ))
将您传递的字符串转换为您想要的对象类型。
- 确保正确制定初始字符串。这可能取决于您希望传递的数组的内容。
这是一个示例脚本:
println(string("First Arg Passed to Script: ", ARGS[1]))
println(string("typeof(ARGS[1]) = ", typeof(ARGS[2])))
println(string("Second Arg Passed to Script: ", ARGS[2]))
println(string("typeof(ARGS[2]) = ", typeof(ARGS[2])))
MyArray = eval(parse(ARGS[1]))
println(string("typeof(MyArray) = ", typeof(MyArray)))
println(string("length(MyArray) = ", length(MyArray)))
println(string("MyArray = ", MyArray))
运行 使用以下终端命令:
julia /Users/aireties/Desktop/ArrayTest.jl "[2, 4, 5]" 23
产生输出:
First Arg Passed to Script: [2, 4, 5]
typeof(ARGS[1]) = UTF8String
Second Arg Passed to Script: 23
typeof(ARGS[2]) = UTF8String
typeof(MyArray) = Array{Int64,1}
length(MyArray) = 3
MyArray = [2,4,5]
注意:但是,如果我希望在从命令行传递的数组中包含字符串,我需要使用第二组单引号,将带有 Julia 用来指示字符串的双引号的数组:
julia /Users/aireties/Desktop/ArrayTest.jl '["a", "b", 5]' 23
电话:
julia /Users/aireties/Desktop/ArrayTest.jl "["a", "b", 5]" 23
会产生错误。
@aireties的回答很好。但是,我想我会提供另一个选项,如果输入数组很大,它会特别有效。只需将输入数组存储在已知位置的文本文件中,例如/someAbsolutePath/myArray.csv
然后在调用 julia
时将文本文件的位置作为参数传递。然后,在脚本的前几行中,调用 readcsv
瞧。
当您想从命令行调用需要大量输入的例程时,这实际上是许多语言(例如 Python/R/Matlab)的一种相当常见的策略。我在生产环境中看到过编译的 Matlab 例程,这些例程将自定义文本文件的位置作为命令行中的单个输入参数。然后,Matlab 例程的第一部分将从自定义文本文件中读取大量输入参数(如果文本文件与预期不符,则会抛出错误)。在某些情况下,文本文件将包含许多包含其他相关输入的其他文本文件的位置!
ARGS 关键字允许在从命令行调用 Julia 脚本时指定参数(请参阅 Access command line arguments in Julia)。这样,命令行调用中的每个 space 都在 ARGS 数组中标记一个单独的元素。如果我希望这些元素之一本身是任意长度的数组怎么办?只是连接 ARGS 的单独元素在这里似乎不合适。
这里有两个键。
- 请注意,您从命令行传递给脚本的任何内容最初都是一个字符串。在脚本中使用
eval(parse( ))
将您传递的字符串转换为您想要的对象类型。 - 确保正确制定初始字符串。这可能取决于您希望传递的数组的内容。
这是一个示例脚本:
println(string("First Arg Passed to Script: ", ARGS[1]))
println(string("typeof(ARGS[1]) = ", typeof(ARGS[2])))
println(string("Second Arg Passed to Script: ", ARGS[2]))
println(string("typeof(ARGS[2]) = ", typeof(ARGS[2])))
MyArray = eval(parse(ARGS[1]))
println(string("typeof(MyArray) = ", typeof(MyArray)))
println(string("length(MyArray) = ", length(MyArray)))
println(string("MyArray = ", MyArray))
运行 使用以下终端命令:
julia /Users/aireties/Desktop/ArrayTest.jl "[2, 4, 5]" 23
产生输出:
First Arg Passed to Script: [2, 4, 5]
typeof(ARGS[1]) = UTF8String
Second Arg Passed to Script: 23
typeof(ARGS[2]) = UTF8String
typeof(MyArray) = Array{Int64,1}
length(MyArray) = 3
MyArray = [2,4,5]
注意:但是,如果我希望在从命令行传递的数组中包含字符串,我需要使用第二组单引号,将带有 Julia 用来指示字符串的双引号的数组:
julia /Users/aireties/Desktop/ArrayTest.jl '["a", "b", 5]' 23
电话:
julia /Users/aireties/Desktop/ArrayTest.jl "["a", "b", 5]" 23
会产生错误。
@aireties的回答很好。但是,我想我会提供另一个选项,如果输入数组很大,它会特别有效。只需将输入数组存储在已知位置的文本文件中,例如/someAbsolutePath/myArray.csv
然后在调用 julia
时将文本文件的位置作为参数传递。然后,在脚本的前几行中,调用 readcsv
瞧。
当您想从命令行调用需要大量输入的例程时,这实际上是许多语言(例如 Python/R/Matlab)的一种相当常见的策略。我在生产环境中看到过编译的 Matlab 例程,这些例程将自定义文本文件的位置作为命令行中的单个输入参数。然后,Matlab 例程的第一部分将从自定义文本文件中读取大量输入参数(如果文本文件与预期不符,则会抛出错误)。在某些情况下,文本文件将包含许多包含其他相关输入的其他文本文件的位置!