Reputation: 67
Can somebody suggest a better way to execute multiple commands within JSON using Python.
For example how to improve the following:
JSON:
$ python -m json.tool test2.json
{
"command": "mkdir -p /home/ec2-user/data2/opt/ODS",
"command1": "mkdir -p /home/ec2-user/data4/opt/ODS",
"command2": "mkdir -p /home/ec2-user/data5/opt/ODS"
}
Python:
$ cat parse.py
import json
import sys
import subprocess
from pprint import pprint
jdata = open(sys.argv[1])
data = json.load(jdata)
print "start"
print(data)
subprocess.call(data['command'], shell=True)
subprocess.call(data['command1'], shell=True)
subprocess.call(data['command2'], shell=True)
print "end"
jdata.close()
Output:
]$ python parse.py test2.json start {u'command1': u'mkdir -p /home/ec2-user/data4/opt/ODS', u'command2': u'mkdir -p /home/ec2-user/data5/opt/ODS', u'command': u'mkdir -p /home/ec2-user/data2/opt/ODS'} end
TIA
Upvotes: 0
Views: 2765
Reputation: 3722
Similar to @Mark's answer, but keeping your original structure:
$ cat parse.py
import json
import sys
import
from pprint import pprint
jdata = open(sys.argv[1])
data = json.load(jdata)
print "start"
print(data)
for command in data.values():
subprocess.call(command, shell=True)
print "end"
jdata.close()
Upvotes: 0
Reputation: 4453
Here's the structure and code you are looking for:
$ python -m json.tool test2.json
[
"mkdir -p /home/ec2-user/data2/opt/ODS",
"mkdir -p /home/ec2-user/data4/opt/ODS",
"mkdir -p /home/ec2-user/data5/opt/ODS"
]
Python:
$ cat parse.py
import json
import sys
import subprocess
from pprint import pprint
jdata = open(sys.argv[1])
data = json.load(jdata)
print "start"
print(data)
for command in data:
subprocess.call(command, shell=True)
print "end"
jdata.close()
Output:
$ python parse.py test2.json
start
[u'mkdir -p /home/ec2-user/data2/opt/ODS', u'mkdir -p /home/ec2-user/data4/opt/ODS', u'mkdir -p /home/ec2-user/data5/opt/ODS']
end
Upvotes: 1
Reputation: 1608
In your example it would be better, to use os.makedirs.
But if you REALLY need subprocess
module - i suggest you to exec command with single subprocess instance. For example:
subprocess.call('; '.join(data.values()), shell=True)
Upvotes: 0