2016-11-17 4 views
2

Ich schreibe ein Python-Skript, um einige bash-Befehle zu automatisieren, und habe Probleme beim Übergeben einer Variablen innerhalb des curl-Befehls. Das ist, was ich habe:Hinzufügen von Variablen in Anführungszeichen in einem Python-Skript

subprocess.call('''curl -H 'Content-Type: application/json' -X PUT -d '{"name": "{}".format(someVariable), "hive_ql": "CREATE VIEW user_balance AS SELECT NAME, LOB,ACCOUNT,BALANCE FROM csvtable"}' localhost:someport/api''', shell=True)

Ich versuche, eine Variable übergeben in die ‚name‘ Parameter, bezeichnet mit ‚somevariable‘ in diesem Beispiel. Aber ich bekomme einen Fehler, der besagt:

"message": "Failed to decode JSON object: Expecting ',' delimiter: line 1 column 14 (char 13):

Als ich das Format Teil mit einer tatsächlichen Zeichenfolge zu ersetzen, das Skript gerade fein ausgeführt, so weiß ich, ich mache etwas falsch mit Bestehen der Variable zwischen den Anführungszeichen, nur nicht sicher, was die richtige Syntax ist.

+0

'call' nimmt eine Liste von Strings. Siehe die Dokumentation: https://docs.python.org/3/library/subprocess.html#subprocess.run –

+0

Versuchen Sie nicht, JSON so zu erzeugen; benutze 'json.dumps'. – chepner

Antwort

2

Es wird klarer, eine Liste zu subprocess.call weitergeben müssen:

import json 
import subprocess 

someVariable = 'hello' 
hive_ql = 'CREATE VIEW user_balance AS SELECT NAME, LOB,ACCOUNT,BALANCE FROM csvtable' # noqa 

subprocess.call([ 
    'curl', 
    '-H', 
    'Content-Type: application/json', 
    '-X', 
    'PUT', 
    '-d', 
    json.dumps({ 
     'name': str(someVariable), 
     'hive_ql': hive_ql 
    }), 
    'localhost:someport/api' 
]) 
+0

Wenn ich das laufe, bekomme ich 'curl: probiere' curl --help 'oder' curl --manual 'für weitere Informationen' – covfefe

+1

Versuche 'shell = True' zu entfernen – JuniorCompressor

+0

^Das hat funktioniert, danke! Irgendeine Idee, warum das das Problem gewesen sein könnte? – covfefe

1

Sie rufen nicht .format, es ist in Ihrer Zeichenfolge. Versuchen Sie folgendes:

subprocess.call('''curl -H 'Content-Type: application/json' -X PUT -d '{"name": "{}", "hive_ql": "CREATE VIEW user_balance AS SELECT NAME, LOB,ACCOUNT,BALANCE FROM csvtable"}' localhost:someport/api'''.format(someVariable), shell=True) 

Wie es aussieht, sind versucht, die JSON Sie zu entschlüsseln ist:

{ 
    "name": "{}".format(someVariable), 
    "hive_ql": "CREATE VIEW user_balance AS SELECT NAME, LOB,ACCOUNT,BALANCE FROM csvtable" 
} 

weil Python gerade ist .format(someVariable) als Teil der Zeichenfolge zu behandeln und nicht mit dem Wert ersetzt von someVariable, und natürlich ist es nicht gültig, dass JSON am Ende einer Saite hängt.

Edit: Ich habe vergessen, die Klammern zu entkommen; versuchen Sie stattdessen:

subprocess.call('''curl -H 'Content-Type: application/json' -X PUT -d '{{"name": "{}", "hive_ql": "CREATE VIEW user_balance AS SELECT NAME, LOB,ACCOUNT,BALANCE FROM csvtable"}}' localhost:someport/api'''.format(someVariable), shell=True) 
+0

Wenn ich das ausgeführt habe, bekam ich KeyError: '"name"' – covfefe

+0

Meine Antwort in der Bearbeitung behoben! –

Verwandte Themen