Chris Rebert (c...@rebertia.com) wrote: > On Mon, Jul 12, 2010 at 6:29 PM, Kenny Meyer <knny.m...@gmail.com> wrote: > > Hello, > > > > I have to figure out if a string is callable on a Linux system. I'm > > "callable" seems vague. Is a command string with invalid arguments but > a valid executable "callable"? If no, then there's no general way to > test "callability" without actually running the command.
I'm glad you pointed that out, because you're right. I subconciously meant a file that is in the $PATH. [snip] > > Well, you're not gonna be able to get the command's return code > without actually running it (unless perhaps you're referring to a > return code from the shell itself?). > > > What are better ways of doing this? > > One idea: > > from shlex import split as shell_tokenize > from subprocess import check_output > > def is_valid_command(command): > try: > executable = shell_tokenize(command)[0] > except (ValueError, IndexError):# invalid shell syntax > return False > return bool(check_output(['which', executable]))# on the PATH? > I have tried this and found some unexpected issues with Python 2.6 which I though I should point out: Firstly, the function `check_output` in the `subprocess` module only comes with Python 2.7, but I have found a similar function called `check_call` [1] which seems is similar, but not the same. [1] http://docs.python.org/library/subprocess.html#subprocess.check_call The code now looks like this: from shlex import split as shell_tokenize from subprocess import check_call, CalledProcessError def is_valid_command(command): try: executable = shell_tokenize(command)[0] check_call(['which', executable]) # Raises CalledProcessError if # something went wrong return True except (ValueError, IndexError, CalledProcessError): # Catch exception if there # was an error calling the process return False The idea with `which` is really great one. Thanks a lot, for your time and your input. -- Onward and upwards, Kenny Meyer
signature.asc
Description: Digital signature
-- http://mail.python.org/mailman/listinfo/python-list