daimne
daimne

Reputation: 67

Is there a better way to execute commands in JSON running python

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

Answers (3)

atwalsh
atwalsh

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

Mark
Mark

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

Yaroslav Surzhikov
Yaroslav Surzhikov

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

Related Questions