2014-07-10 2 views
5
ausgeführt werden

Ich versuche run() oder success() zu verwenden, um ein Python-Skript von Julia auszuführen.Julia: Befehl kann nicht mit Argumenten über die String-Variable

Ich kann es gut laufen, wenn ich den Befehl von Hand angeben:

julia> run(`python sample.py`) 
woo! sample 

Allerdings, wenn ich es über ein String-Argument zu laufen versuchen, es funktioniert plötzlich nicht mehr.

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 

Die Angabe des vollständigen Pfads für sample.py führt zum gleichen Ergebnis. Seltsamer, nur läuft Python als String funktioniert:

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. 
>>> 

Bin ich etwas falsch gemacht?

Danke

Antwort

6

Dies ist aufgrund der specialized command interpolation. Es behandelt jeden interpolierten Teil als unabhängigen Abschnitt des Befehls. Während manchmal etwas unintuitive, es Ihnen völlig zu vergessen, über alle Schwierigkeiten zu zitieren, Leerzeichen, usw.

Wenn Sie run(`$str`) erlaubt, ist es str als gesamten Befehlsnamen zu behandeln, weshalb beklagt es ist, dass es nicht finde die ausführbare Datei mit dem Namen "python sample.py". Wenn Sie möchten, „Python“ mit dem Argument „sample.py“ ausführen können, müssen Sie zwei Einschübe:

cmd = "python" 
arg = "sample.py" 
run(`$cmd $arg`) 

Dies ermöglicht dem Argument, einen Raum zu haben, und es wird nach wie vor alle als erstes Argument behandelt werden .

Wenn Sie wirklich eine Zeichenfolge wie "python sample.py" verwenden möchten, können Sie es an seinem Leerzeichen aufgeteilt:

str = "python sample.py" 
run(`$(split(str))`) # strongly unadvised 

Aber beachten Sie, dass dies dem Argument Name sehr zerbrechlich sein. Wenn Sie jemals eine Datei mit dem Namen "My Documents/sample.py" ausführen möchten, wird dies abgebrochen, während die erste Interpolation einfach funktioniert.

+3

Vermutlich gibt es ein genaues Parallelproblem bei der Verwendung von Python (daher 'subprocess.call ([" python "," sample.py "])'). – DSM