Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

scl enable python27 bash

I've hit a snag with a shell script intended to run every 30 minutes in cron on a Redhat 6 server. The shell script is basically just a command to run a python script.

The native version python on the server is 2.6.6 but the python version required by this particular script is python 2.7+. I am able to easily run this on the command line by using the "scl" command (this example includes the python -V command to show the version change):

$ python -V Python 2.6.6 $ scl enable python27 bash $ python -V Python 2.7.3 

At this point I can run the python 2.7.3 scripts on the command line no problem.

Here's the snag.

When you issue the scl enable python27 bash command it starts a new bash shell session which (again) is fine for interactive commandline work. But when doing this inside a shell script, as soon as it runs the bash command, the script exits because of the new session.

Here's the shell script that is failing:

#!/bin/bash cd /var/www/python/scripts/ scl enable python27 bash python runAllUpserts.py >/dev/null 2>&1 

It simply stops as soon as it hits line 4 because "bash" pops it out of the script and into a fresh bash shell. So it never sees the actual python command I need it to run.

Plus, if run every 30 minutes, this would add a new bash each time which is yet another problem.

I am reluctant to update the native python version on the server to 2.7.3 right now due to several reasons. The Redhat yum repos don't yet have python 2.7.3 and a manual install would be outside of the yum update system. From what I understand, yum itself runs on python 2.6.x.

Here's where I found the method for using scl

http://developerblog.redhat.com/2013/02/14/setting-up-django-and-python-2-7-on-red-hat-enterprise-6-the-easy-way/

like image 704
gerion Avatar asked May 19 '13 04:05

gerion


2 Answers

Doing everything in one heredoc in the SCL environment is the best option, IMO:

scl enable python27 - << \EOF cd /var/www/python/scripts/ python runAllUpserts.py >/dev/null 2>&1 EOF 

Another way is to run just the second command (which is the only one that uses Python) in scl environment directly:

cd /var/www/python/scripts/ scl enable python27 "python runAllUpserts.py >/dev/null 2>&1" 
like image 85
slavek Avatar answered Sep 27 '22 19:09

slavek


scl enable python27 bash activates a python virtual environment.

You can do this from within a bash script by simply sourcing the enable script of the virtual environment, of the SCL package, which is located at /opt/rh/python27/enable

Example:

#!/bin/bash cd /var/www/python/scripts/ source /opt/rh/python27/enable python runAllUpserts.py >/dev/null 2>&1 
like image 23
wenjianhn Avatar answered Sep 27 '22 19:09

wenjianhn