I have a third party script that uses the shebang #!/usr/bin/env python
.
According to the python documentation, this is the correct form for scripts that are suitable for both Python v2 and Python v3 (https://docs.python.org/3/using/windows.html#shebang-lines).
My Ubuntu (WSL) has only Python 3 installed:
~❯ which python
~❯ which python3
/usr/bin/python3
I have added this to the path, by adding the following in my ~/.bashrc
and sourcing it
export PATH=/usr/bin/python3:${PATH}
export PY_PYTHON=3 # also added this for good measure, but no joy
~❯ . ~/.bashrc
~❯ env | grep PATH
PATH=/home/me/.local/bin:/home/me/bin:/usr/bin/python3:/opt/gradle/gradle-5.3.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Yet when I run this script it complains that it cannot find Python. I have created a short test file foo
that contains the same shebang and a print("Hello")
:
~❯ ./foo
/usr/bin/env: ‘python’: No such file or directory
What else can I do to make env
use python3?
PS: I do not have python 2, nor do I wish to install it. The third party script's README specifically mentions supporting both Python v2 and v3, and the shebang indicates this, as mentioned, according to the Python docs themselves.
PPS: Adding aliases does not resolve this as they are only effective when the user is calling python at the prompt, not when the bash itself is running a script. This answer to a similar question explicitly cites this behaviour: https://askubuntu.com/a/351380/333103
PPPS: The received wisdom from other questions is that symlinking is not the correct solution to env
issues (don't have link to hand just ATM)
env
cannot find python because env is searching python in yourPATH
, not on any shell builtin, or alias or function. As you have defined python as usingEXPORT
env won't find it, it will search through 'PATH' and will resolve python to /usr/bin/python (which is python2 and not present in the system).You can check all the available locations of executable python, in bash, do:
You are unlucky if you want to use an alias in shebang as by definition, shebang needs to be an full path to the interpreter executable, which the env should resolve python to when you use
/usr/bin/env python
. To interpret the script using python3 use the shebang:Since OP does not install python2 and doesn't need /usr/bin/python as python2, I'm suprised that no one mentioned the most simple solution.
You just symbolic link python to python3 with
sudo ln -s python3 /usr/bin/python
, and it will work.Or, config the alternatives as mentioned in the comment(3.6 if you're using Ubuntu 18.04 on WSL):