Julia:如何从Julia代码中执行系统命令?

3
我已创建了一个字符串。
x = "ls"

我想以字符串形式从Julia中执行x。我该如何做?

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

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


5
不确定我是否理解了你的问题,但是 x = @cmd "ls"; run(x) 是否能够实现你想要的功能? - Gnimuc
2个回答

9
您可以简单地使用 run 命令和 Cmd 对象。您可以通过字符串的方式,使用 `` 和插值运算符 $ 或使用 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/


1
我遇到了 IOError 错误:无法生成 split ..... -n l/3 -d .....。出现了“没有这个文件或目录”的错误。有什么想法吗? - xiaodai
正如我在答案中所说,您可能需要检查文件路径(它们似乎是错误的),并确保命令“split”在您的“PATH”中。否则,请将其添加到您的“PATH”中,确保它是可执行的等。 - hckr
也许尝试在您的 shell 中直接运行该命令,看看是否会产生任何错误。 - hckr
1
实际上,`` 要求您将组件按逻辑分组,例如 m = split abc.txt def.txt; run(m); 将失败,而 m = "abc.txt"; out="def.txt"; run(\split $m $out`)将起作用。对于-d-n 3/l` 等选项也是如此。 - xiaodai
1
你需要执行 option1 = "-n l/3"; option2 = "-d"; run(\$x $path1 $option1 $option2 $path2`)`; 如果你改变它,我会给你答案。 - xiaodai
1
我的错误。你是对的!两个选项都被自动引用在一个中,这就导致了问题。您始终可以打印命令对象以检查错误。 - hckr

3

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

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

重要的是将命令及其参数用反引号括起来。例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接