Hemanth's Scribes

python

Tweaking Command Not Found

Author Photo

Hemanth HM

Thumbnail

Most of the time in ubuntu, when we come across the message like : The program ‘program_name’ is currently not installed. You can install it by typing: sudo apt-get install program_name


We would end-up doing  **"sudo apt-get install program_name"** and installing it.

This repeats so why not automate the same? Solving this question, I had to do the below :

Bash shell has a hook called **command_not_found_handle**

Most of the time in ubuntu, when we come across the message like : 
The program 'program_name' is currently not installed.  You can install it by typing:
sudo apt-get install program_name

We would end-up doing “sudo apt-get install program_name” and installing it.

This repeats so why not automate the same? Solving this question, I had to do the below :

Bash shell has a hook called command_not_found_handle

command_not_found_handle () 
{ 
    if [ -x /usr/lib/command-not-found ]; then
        /usr/bin/python /usr/lib/command-not-found -- $1;
        return $?;
    else
        if [ -x /usr/share/command-not-found ]; then
            /usr/bin/python /usr/share/command-not-found -- $1;
            return $?;
        else
            return 127;
        fi;
    fi
}

The above handler is basically invoking “/usr/lib/command-not-found”, which makes use of the lib ”./python2.6/dist-packages/CommandNotFound/CommandNotFound.py”

The crux of this lib is too check if there is a key for the given command in the db present at “/usr/share/command-not-found” and return suitable message.

Making a small hack, as below can achieve automatic package installation, if not already installed :

```python
import subprocess
def check_install(command):
    cnf = CommandNotFound("/usr/share/command-not-found")

    result = set()
    for db in cnf.programs:
        result.update([(pkg,db.component) for pkg in db.lookup(command)])
    
    package = list(result)
    if(len(package) > 0 ):
            if subprocess.Popen("sudo apt-get -y install "+package[0][0],shell=True).wait() == 0:
            print "\
"
            print "Installation done !\
"
    
        else:
            print "\
"
            print " [>] Failed to install\
"

Now a simple invocation like : check_install(‘sl’) would install the package ‘sl’

** Alternative easier hack! : **

If you are from bash school, the hack is very simple :

check_install () 
{ 
    type -P $@ || sudo apt-get install $@
}

Place that in your ~/.bashrc and source ~/.bashrc and then you can do check_install sl


** Hack and let hack! **
#python
Author Photo

About Hemanth HM

Hemanth HM is a Sr. Machine Learning Manager at PayPal, Google Developer Expert, TC39 delegate, FOSS advocate, and community leader with a passion for programming, AI, and open-source contributions.