Julia:无法通过字符串变量运行带参数的命令

Mag*_*eek 7 julia

我试图使用run()或success()从Julia执行Python脚本.

如果我手动指定命令,我可以正常运行:

julia> run(`python sample.py`)
woo! sample
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试通过字符串参数运行它,它突然不起作用.

julia> str = "python sample.py"
"python sample.py"

julia> run( `$str` )
ERROR: could not spawn `'python sample.py'`: no such file or directory (ENOENT)
 in _jl_spawn at process.jl:217
 in spawn at process.jl:348
 in spawn at process.jl:389
 in run at process.jl:478
Run Code Online (Sandbox Code Playgroud)

指定sample.py的完整路径会产生相同的结果.奇怪的是,只需将python作为字符串运行就可以了:

julia> str = "python"
"python"

julia> run( `$str` )
Python 2.7.3 (default, Feb 27 2014, 19:58:35) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
Run Code Online (Sandbox Code Playgroud)

我做错了什么吗?

谢谢

Mat*_* B. 8

这是由于专门的命令插值.它将每个插值部分视为命令的独立部分.虽然有时略显不直观,但它可以让你完全忘记引用,空白等所有困难.

当你run(`$str`),它被str视为整个命令名称,这就是为什么它抱怨它找不到具有名称的可执行文件"python sample.py".如果您想使用参数"sample.py"运行"python",则需要两个插值:

cmd = "python"
arg = "sample.py"
run(`$cmd $arg`)
Run Code Online (Sandbox Code Playgroud)

这允许你的参数有一个空格,它仍将被视为第一个参数.

如果你真的想要使用类似的字符串"python sample.py",你可以在它的空白处拆分它:

str = "python sample.py"
run(`$(split(str))`) # strongly unadvised
Run Code Online (Sandbox Code Playgroud)

但请注意,这对参数名称来说非常脆弱.如果您想要运行名为"My Documents/sample.py"的文件,这将会中断,而第一次插值将起作用.

  • 可能不足为奇的是,使用Python时存在一个完全平行的问题(因此`subprocess.call(["python","sample.py"])`). (3认同)