Embed Bash In Python
Solution 1:
The ideal way to do it:
defrun_script(script, stdin=None):
"""Returns (stdout, stderr), raises error on non-zero return code"""import subprocess
# Note: by using a list here (['bash', ...]) you avoid quoting issues, as the # arguments are passed in exactly this order (spaces, quotes, and newlines won't# cause problems):
proc = subprocess.Popen(['bash', '-c', script],
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
stdin=subprocess.PIPE)
stdout, stderr = proc.communicate()
if proc.returncode:
raise ScriptException(proc.returncode, stdout, stderr, script)
return stdout, stderr
classScriptException(Exception):
def__init__(self, returncode, stdout, stderr, script):
self.returncode = returncode
self.stdout = stdout
self.stderr = stderr
Exception().__init__('Error in script')
You might also add a nice __str__
method to ScriptException
(you are sure to need it to debug your scripts) -- but I leave that to the reader.
If you don't use stdout=subprocess.PIPE
etc, the script will be attached directly to the console. This is really handy if you have, for instance, a password prompt from ssh. So you might want to add flags to control whether you want to capture stdout, stderr, and stdin.
Solution 2:
If you want to call system commands, use the subprocess module.
Solution 3:
Is
import osos.system ("bash -c 'echo $0'")
going to do it for you?
EDIT: regarding readability
Yes, of course, you can have it more readable
import os
script = """
echo $0
ls -l
echo done
"""
os.system("bash -c '%s'" % script)
EDIT2: regarding macros, no python does not go so far as far as i know, but between
import os
def sh(script):
os.system("bash -c '%s'" % script)
sh("echo $0")
sh("ls -l")
sh("echo done")
and previous example, you basically get what you want (but you have to allow for a bit of dialectical limitations)
Solution 4:
Assuming the command is supported by the host system:
import osos.system('command')
If you have a long command, or a set of commands. you can use variables. eg:
# this simple line will capture column five of file.log# and then removed blanklines, and gives output in filtered_content.txt.import os
filter = "cat file.log | awk '{print $5}'| sed '/^$/d' > filtered_content.txt"
os.system(filter)
Solution 5:
subprocess and os.system() works fine when bash commands are simple and does not have brackets, commas and quotes. Simple way to embed complex bash argument is to add bash script at the end of python script with a unique string comments and use simple os.system() commands to tail and convert to bash file.
#!/usr/bin/python## name this file "file.py"
import os
def get_xred(xx,yy,zz):
xred=[]
####gaur###
xred.append([ zz[9] , zz[19] , zz[29] ])
xred.append([ zz[9] , xx[9] , yy[9] ])
xred.append([ zz[10], zz[20] , zz[30] ])
xred.append([ zz[10], xx[10] , yy[10] ])
###nitai###
xred=np.array(xred)
return xred
## following 3 lines executes last 6 lines of this file.
os.system("tail -n 6 file.py >tmpfile1")
os.system("sed 's/###123//g' tmpfile1>tmpfile2")
os.system("bash tmpfile2")
###### Here ###123 is a unique string to be removed###123#!/bin/sh###123awk '/###gaur/{flag=1;next}/###nitai/{flag=0} flag{print}' file.py >tmp1###123cat tmp1 | awk '{gsub("xred.append\\(\\[","");gsub("\\]\\)","");print}' >tmp2###123awk 'NF >0' tmp2 > tmp3###123sed '$d' tmp3 |sed '$d' | sed '$d' >rotation ; rm tmp*
Post a Comment for "Embed Bash In Python"