2016-07-14 8 views
0

Ich brauche diese Abfrage zu feuern, die auf dem Terminal läuft perfekt:Python subprocess für Abfragen mit Zitaten

sed -i '' '/default\]/a\'$'\n'' Hello world'$'\n' <PATH_TO_FILE> 

Dies fügt eine Zeile weiter unten, wo ich „default]“ string finden.

Mit dem Python-Code:

query = r""" sed -i '' '/default\]/a\'$'\n'' Hello world'$'\n' %s """ % (PATH_T)_FILE) 
proc = subprocess.Popen(query.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
output, err = proc.communicate() 

jedoch der Befehl fehlschlägt in Python mit Fehlern:

Error executing the query sed -i '' '/default\]/a\'$'\n'' Hello world'$'\n' /Users/hshah/tmpFile . output = , error = sed: 1: "'/default\]/a\'$'\n''": invalid command code ' 

Was ist das Problem hier sein könnte?

+0

Die erste Zeile, die query definiert, ist kein gültiger Python-Code. –

+1

@FullName Richtig; wahrscheinlich '(PATH_T) _FILE)' sollte '(PATH_TO_FILE)' sein. Ich frage mich, warum jemand den Code hier anstelle von Kopieren/Einfügen eingeben würde ... – glglgl

Antwort

2

Sie split auf alle Whitespace. Dies bewirkt, dass query.split()

['sed', 
'-i', 
"''", 
"'/default\\]/a\\'$'\\n''", 
'Hello', 
"world'$'\\n'", 
'/tmp/foo'] 

sein, das ist nicht das, was Sie wollen. Erstellen Sie die Parameter für subprocess.Popen von Hand, nicht durch Aufteilen einer Zeichenfolge.

+1

Oder verwenden Sie [shlex.split] (https://docs.python.org/2/library/shlex.html#shlex.split). – glglgl

+0

BTW, die Parameter für 'Popen' wären' ['sed', '-i', '', '/ default \]/a \ n', 'Hallo Welt \ n', PATH_TO_FILE] '. – glglgl