675

How do I find the full path of the currently running Python interpreter from within the currently executing Python script?


See How do I check which version of Python is running my script? if you are specifically interested in the version of Python for the currently running interpreter - for example, to bail out with an error message if your script doesn't support that Python version, or conditionally disable certain modules or code paths.

3 Answers 3

1023

sys.executable contains full path of the currently running Python interpreter.

import sys

print(sys.executable)

which is now documented here

Sign up to request clarification or add additional context in comments.

9 Comments

This does not seem to work from scripts with a shebang /usr/bin/env python executed as env -i ./script. In that case it returns the current working directory.
@JohnFreeman: I tried this on a GNU/Linux box w/ GNU coreutils 8.4 (env) and Python 3.4.2. #!/usr/bin/env python3 will return the correct full binary path via sys.executable. Perhaps your OS or Python version behaves slightly differently.
Note that this will not return the name of the Python interpreter if Python is embedded in some application.
I tried this with the shebang for python2 and python3 and it printed the correct executable. I also tried with no shebang and called the script with the python and python3 commands and it printed the correct executable.
@mic_e, this may have been true in 2015, but I just tried it today and it behaves as expected (it returns the absolute file of the executable that embeds Python).
|
19

Just noting a different way of questionable usefulness, using os.environ:

import os
python_executable_path = os.environ['_']

e.g.

$ python -c "import os; print(os.environ['_'])"
/usr/bin/python

6 Comments

useless but funny :) (perhaps also not portable)
It seems that _ is set by the shell. But it need not be set, so this could give the wrong answer.
FYI, when in a Jupyter notebook, this gives the path to the kernel launcher script.
_ can be /usr/bin/screen if Python is run inside a GNU Screen.
Does not work on Windows (10). The environment variable _ is not set.
|
-1

There are a few alternate ways to figure out the currently used python in Linux is:

  1. which python command.
  2. command -v python command
  3. type python command

Similarly On Windows with Cygwin will also result the same.

kuvivek@HOSTNAME ~
$ which python
/usr/bin/python

kuvivek@HOSTNAME ~
$ whereis python
python: /usr/bin/python /usr/bin/python3.4 /usr/lib/python2.7 /usr/lib/python3.4        /usr/include/python2.7 /usr/include/python3.4m /usr/share/man/man1/python.1.gz

kuvivek@HOSTNAME ~
$ which python3
/usr/bin/python3

kuvivek@HOSTNAME ~
$ command -v python
/usr/bin/python

kuvivek@HOSTNAME ~
$ type python
python is hashed (/usr/bin/python)

If you are already in the python shell. Try anyone of these. Note: This is an alternate way. Not the best pythonic way.

>>> import os
>>> os.popen('which python').read()
'/usr/bin/python\n'
>>>
>>> os.popen('type python').read()
'python is /usr/bin/python\n'
>>>
>>> os.popen('command -v python').read()
'/usr/bin/python\n'
>>>
>>>

If you are not sure of the actual path of the python command and is available in your system, Use the following command.

pi@osboxes:~ $ which python
/usr/bin/python
pi@osboxes:~ $ readlink -f $(which python)
/usr/bin/python2.7
pi@osboxes:~ $ 
pi@osboxes:~ $ which python3
/usr/bin/python3
pi@osboxes:~ $ 
pi@osboxes:~ $ readlink -f $(which python3)
/usr/bin/python3.7
pi@osboxes:~ $ 

4 Comments

"from within the currently executing Python script" wrote the OP
Your "already in the python shell" examples, all assume that the python shell started is what you get if you type python from the shell. If you start with an explicit different path (e.g. /opt/python/2.5/bin/python), or use python3 and then run those python commands, all of them produced incorrect answers and that has nothing to do with not being the most pythonic way, it is just plain wrong.
Does not answer the question of "How do I find the full path of the currently running Python interpreter from within the currently executing Python script?"
Dumpster fire answer. There's no deterministic relation between what the external shell considers to be python (i.e., the absolute filename of the python command in the current ${PATH}) and the command the active Python interpreter is actually running under. Yikes.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.