Python: Check existence of shell command before execution
You can use the subprocess module under Python 3 or the commands module for Python 2 as follow :
status, result = subprocess.getstatusoutput("ls -al")
status, result = commands.getstatusoutput("ls -al")
Then test the value of
Examples from the website :
>>> import subprocess >>> subprocess.getstatusoutput('ls /bin/ls') (0, '/bin/ls') >>> subprocess.getstatusoutput('cat /bin/junk') (256, 'cat: /bin/junk: No such file or directory') >>> subprocess.getstatusoutput('/bin/junk') (256, 'sh: /bin/junk: not found')
couldn't you use the "which" command somehow? the which command automatically performs a lookup for an application in the paths. I think you would merely need to call this command and pass the name of the command you want to look up, then parse the results.
For situations like this, I use:
def find_program(prog_filename, error_on_missing=False): bdirs = ['$HOME/Environment/local/bin/', '$HOME/bin/', '/share/apps/bin/', '/usr/local/bin/', '/usr/bin/'] paths_tried =  for d in bdirs: p = os.path.expandvars(os.path.join(d, prog_filename)) paths_tried.append(p) if os.path.exists(p): return p if error_on_missing: raise Exception("*** ERROR: '%s' not found on:\n %s\n" % (prog_filename, "\n ".join(paths_tried))) else: return None
Then you can do something like:
grep_path = find_program('ack_grep', False) if grep_path is None: # default to standard system grep grep_path = 'grep'
Related videos on Youtube
Gabriel L. Oliveira 4 months
I'm trying to find a way to check the existence of a shell command before its execution.
For example, I'll execute the command ack-grep. So, I'm trying to do:
from subprocess import PIPE
cmd_grep = subprocess.Popen(["ack-grep", "--no-color", "--max-count=1", "--no-group", "def run_main", "../cgedit/"], stdout=PIPE, stderr=PIPE)
Than, if I execute
I receive '' like the output. But I don't have the command ack-grep on my path. So, why Popen is not putting the error message on my .stderr variable?
Also, is there a easyer way to do what I'm trying to do?
trolle3000 over 12 yearsYou should probably ask this on stackoverflow
Scott - Слава Україні over 4 yearsThis would be a better answer if you (1) used a more plausible (useful) example of commands, like the OP’s example of
grep, and (2) showed the code for using the command you want to use versus using the fallback.