Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Run python script with dot slash ./

Tags:

python

I installed two python 2.7.3 into my home directory

   one is for Linux:           /home/luban/Linux/Python/2.7.3
   another is for Solaris:   /home/luban/SunOS/Python/2.7.3

then I create a wrapper named "python" in /home/luban/bin to call the different python when I am working on different systems.

[luban@lunbanworks 1] ~ > cat /home/luban/bin/python

#!/bin/sh

CMD=`basename $0`

OS=`uname -s`


CMD_PATH="/home/luban/$OS/Python/2.7.3/bin"


if [ -x "${CMD_PATH}/${CMD}" ];then

    export PATH="${CMD_PATH}:${PATH}"

    exec ${CMD_PATH}/${CMD} ${1+"$@"}

else

    echo "${CMD} is not available for ${OS}" 1>&2

exit 1

fi

 

[luban@lunbanworks 2] `ls -l /home/luban/bin/python`

-rwxrwxr-x  1 luban lunban  221 Apr  5 19:11 python*

I use below script to test the wrapper /home/luban/bin/python

[luban@lunbanworks 3] ~ > cat myscript.py

    #!/home/luban/bin/python

    myname="lunban"

    print "myname is %s" % myname

[luban@lunbanworks 4] chmod +x myscript.py

I want to use ./ run myscript.py

[luban@lunbanworks 5] ~ >./myscript.py

    myname=luban: Command not found.
    lpr: Unable to access "myname" - No such file or directory

use /home/luban/bin/python myscript.py can work:

[luban@lunbanworks 5] ~ > `/home/luban/bin/python myscript.py`

    myname is luban

After I change the shebang line to #!/home/luban/Linux/Python/2.7.3/bin/python, use ./ can execute the script.

[luban@lunbanworks 6] ~ >cat myscript.py

    #!/home/luban/Linux/Python/2.7.3/bin/python
    myname="lunban"

    print "myname is %s" % myname

[luban@lunbanworks 7] ~ >./myscript.py

    myname is luban

Why when I use #!/home/luban/Linux/Python/2.7.3/bin/python at the beginning of myscript.py, ./myscript.py can work,

but if I use the wrapper #!/home/luban/bin/python in my python script, use ./ to run the script, it cannot not work?

I had many scripts used #!/home/luban/bin/python when I only installed python under #!/home/luban/ for Linux, they can run with ./, I don't want to change them,

so, how to let ./ run the python script If I want to KEEP wrapper #!/home/luban/bin/python as the shebang line?


DEIT:

./myscript.py can NOT work with the wrapper #!/home/luban/bin/python under CentOS 5.4, Bash 3.2.25

today, I have a test under CentOS 6.4, Bash 4.1.2:

I added

echo '$0 =' $0
echo '${COMMAND_PATH}/${COMMAND} ${1+"$@"} =' ${COMMAND_PATH}/${COMMAND} ${1+"$@"}

into the wrapper #!/home/luban/bin/python to track.

./myscript.py works with the wrapper #!/home/luban/bin/python

[luban@lunbanworks 20] ./myscript.py 
      $0 =  /home/luban/bin/python
      ${COMMAND_PATH}/${COMMAND} ${1+"$@"} =  /home/luban/Linux/Python/2.7.3/bin/python ./myscript.py
      myname is luban

So I suppose that it may be a Bash 3.2.25 bug for ./ when I use the wrapper #!/home/luban/bin/python?

like image 654
lubanworks Avatar asked Apr 05 '13 15:04

lubanworks


1 Answers

Have you considered:

#!/usr/bin/env python

That generally works for me, so long as python is found in the search path.

In your case, you would want your profile to have the following in the profile setup:

# Adjust for your preferred shell
export PATH=/home/luban/Linux/Python/2.7.3:/home/luban/SunOS/Python/2.7.3:$PATH

Then, when your python script runs with the "#!/usr/bin/env python" shebang, it will find the right python for you.

like image 166
Wing Tang Wong Avatar answered Nov 17 '22 11:11

Wing Tang Wong