Julia:从命令行传递任意长度的数组到脚本

时间:2016-05-27 21:33:45

标签: arrays command-line-interface julia

ARGS关键字允许在从命令行调用Julia脚本时指定参数(请参阅Access command line arguments in Julia)。这样,命令行调用中的每个空格都标记了ARGS数组中的单独元素。如果我希望其中一个元素本身是一个任意长度的数组怎么办?只是连接ARGS的单独元素似乎不合适。

2 个答案:

答案 0 :(得分:4)

这里有两把钥匙。

  1. 请注意,从命令行传递给脚本的任何内容最初都是字符串。在脚本中使用eval(parse( ))将您传递的字符串转换为您想要的对象类型。
  2. 确保正确制定初始字符串。这可能取决于您希望传递的数组的内容。
  3. 以下是一个示例脚本:

    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 /Users/aireties/Desktop/ArrayTest.jl '["a", "b", 5]'  23
    

    致电:

    julia /Users/aireties/Desktop/ArrayTest.jl "["a", "b", 5]"  23
    

    会产生错误。

答案 1 :(得分:3)

@aireties提供的答案很好。但是,我认为如果输入数组很大,我提供的另一个选项效果特别好。只需将输入数组存储在已知位置的文本文件中,例如/someAbsolutePath/myArray.csv然后在调用julia时将文本文件的位置作为参数传入。然后,在脚本的前几行中,拨打readcsv并瞧。

当你想从命令行调用一个需要大量输入的例程时,对于像Julia这样的许多语言(例如Python / R / Matlab)来说,这实际上是一种相当普遍的策略。我在生产环境中看到了编译的Matlab例程,它将自定义文本文件的位置作为命令行中的单个输入参数。然后,Matlab例程的第一部分将从自定义文本文件中读取一大堆输入参数(如果文本文件看起来不像预期那么会抛出错误)。在某些情况下,文本文件将包含许多包含其他相关输入的其他文本文件的位置!