Run python script with dot slash ./

python

Solution

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.

Problem

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`?

Original source