【问题标题】:Julia: How to execute a system command from Julia code?Julia:如何从 Julia 代码执行系统命令?
【发布时间】:2019-03-02 07:45:38
【问题描述】:

我已经创建了一个字符串

x = "ls"

我想将x 作为来自 Julia 的字符串执行。我怎么做?

ls 只是一个人为的例子,我实际上想执行一个更复杂的命令,所以请不要告诉我pwd() 有效。

实际的命令可能是split c:/data/Performance_All/Performance_2000Q1.txt -n l/3 -d /c/data/Performance_All_split/Performance_2000Q1.txt

【问题讨论】:

  • 不确定我是否理解你的问题,但x = @cmd "ls"; run(x) 会做你想做的事吗?

标签: julia


【解决方案1】:

您可以简单地将runCmd 对象一起使用。您可以使用字符串通过`` 和插值运算符$ 或通过Cmd 构造函数创建Cmd 对象。

这是一个例子。不过,您可能需要检查文件路径。

x = "split"
path1 = "c:/data/Performance_All/Performance_2000Q1.txt"
option1 = "-n l/3"
option2 = "-d"
path2 = "/c/data/Performance_All_split/Performance_2000Q1.txt"
run(`$x $path1 $option1 $option2 $path2`) # remember the backticks ``

您确实不需要即使文件路径中有空格也需要使用引号。命令对象运行程序并将参数直接传递给它,而不是通过 shell。

您可能需要阅读相关的手册条目。 https://docs.julialang.org/en/v1/manual/running-external-programs/

【讨论】:

  • 我收到 IOError: could not spanw `split ..... -n l/3 -d ..... not such file or directory 错误。有什么想法吗?
  • 正如我在答案中所说,您可能需要检查文件路径(它们似乎是错误的)并确保命令split 在您的PATH 中。否则,将其添加到您的PATH,确保它是可执行的等等。
  • 实际上 `` 要求您将组件放入逻辑组中,例如m = split abc.txt def.txt; run(m); 将失败,而 m = "abc.txt"; out="def.txt"; run(`split $m $out`) 将起作用。这同样适用于 -d-n 3/l 等选项
  • 你需要做option1 = "-n l/3"; option2 = "-d"; run(`$x $path1 $option1 $option2 $path2`);如果你改变它,我会给你分析器
  • 我的错误。你说的对!这两个选项都会被自动引用,这会导致问题。您始终可以打印命令对象以检查错误。
【解决方案2】:

Base::read 可用于运行命令并读取其结果。

您可以在test/spawn.jl中找到运行命令的用法示例

重要的是将命令及其参数包装在反引号中。 例如

out = ""
try
    global out
    out = read(`$x`, String)
catch ex
    @error ex
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多