497

How do I find out which directories are listed in my system’s PYTHONPATH variable, from within a Python script (or the interactive shell)?

bad_coder
  • 11,289
  • 20
  • 44
  • 72
Paul D. Waite
  • 96,640
  • 56
  • 199
  • 270
  • 30
    I'm not sure what are you trying to do, but if you want to know which folders are used to search for modules being imported you should not rely on `PYTHONPATH`. Use `sys.path` for that. – Vanuan Nov 16 '12 at 15:02
  • By simple experiment, I found Vanuan's answer below (printing sys.path) just prints PYTHONPATH. This works after we alter the value using add_path(new_path) which adds to PYTHONPATH. – Chan Kim May 30 '16 at 10:20
  • 7
    The title of this post and the body ask two different questions. `sys.path` is "A list of strings that specifies the search path for modules" - https://docs.python.org/2/library/sys.html#sys.path. PYTHONPATH is an environment variable that effects this list. By any reasonable definition `sys.path` is your "python path". – spinkus Jun 01 '16 at 02:07
  • 8
    Don't forget about `python -m site`. – Andrew McKinlay Jul 02 '18 at 15:15

10 Answers10

800

You would probably also want this:

import sys
print(sys.path)

Or as a one liner from the terminal:

python -c "import sys; print('\n'.join(sys.path))"

Caveat: If you have multiple versions of Python installed you should use a corresponding command python2 or python3.

Vanuan
  • 31,770
  • 10
  • 98
  • 102
  • Same. Linux aaa.com 2.6.18-4-686-bigmem #1 SMP Wed Jun 6 09:41:07 UTC 2007 i686 GNU/Linux ... Debian Sarge – Spechal Nov 16 '12 at 08:34
  • 8
    This is the platform- and environment- independent way to get the current runtime's python path. – Dmitry Minkovsky Nov 29 '12 at 19:06
  • 18
    This answer was much more helpful for my situation than the accepted answer. I know what my environment variables is. I needed to know where python decided to point besides my environment variable. – Vorticity Apr 17 '13 at 19:55
  • I find it easier to use the following, since it makes it clear if the empty string (`''`) is in the path: `python -c "import sys, pprint; pprint.pprint(sys.path)"` ( And I found this answer more helpful, too; the title of the question mislead me into thinking it was about the actual path python was using, rather than the contents of the `PYTHONPATH` environment variable.) – cjs Nov 01 '17 at 04:06
  • I used `sys.path[0]` to get the "deffault" path where a local file ist stored. Oterwise I get an array with lots of paths. e.g `fiel=open(MyLogfile.log, 'w')` – Cutton Eye Jan 25 '18 at 10:43
  • For Python 3: python3 -c "import sys; print('\n'.join(sys.path))" – moojen Feb 23 '20 at 14:28
  • Slightly Cleaner: import sys for p in sys.path: print(p) – juggler Aug 16 '20 at 04:23
  • @juggler Nope, "for" loops are not cleaner than functional style. It's a matter of preference and programming paradigm. – Vanuan Aug 17 '20 at 18:57
  • @Vanuan -I meant that the output was cleaner. from what I could tell.. maybe the output from your one-liner is also as clean? you're right that it's a matter of preference :-) peace :-) – juggler Aug 19 '20 at 00:07
  • @mirceamironenco's solution can be adapted to support Linux/Unix path appending via: `export PYTHONPATH="python -c \"import sys; print(':'.join(sys.path))\""` – David Golembiowski Oct 28 '20 at 18:48
292

sys.path might include items that aren't specifically in your PYTHONPATH environment variable. To query the variable directly, use:

import os
try:
    user_paths = os.environ['PYTHONPATH'].split(os.pathsep)
except KeyError:
    user_paths = []
Mark Ransom
  • 299,747
  • 42
  • 398
  • 622
  • 3
    (or, more generically ...split(os.sep) ). Can't figure out why you're not getting the love, Mark. Your reply is technically more accurate than Paul D Waite's own reply to his question ???? – mjv Sep 28 '09 at 22:46
  • Ah, excellent. Thanks guys, I suspected I was doing something wrong. I’ve deleted my wrong answer; Mark, if you could edit your answer to include the os.sep bit, the points will rightfully be yours. – Paul D. Waite Sep 30 '09 at 11:50
  • 5
    os.sep is incorrect, see http://stackoverflow.com/questions/1499019/how-to-get-the-path-separator-in-python – Mark Ransom Sep 30 '09 at 16:03
  • 2
    And that problem with the separator is probably why I wasn't getting the love. Thanks for setting me straight. – Mark Ransom Sep 30 '09 at 16:03
  • 14
    And if receive a KeyError, does it means that PYTHONPATH is not defined in my system? Is that a problem? Thanks – glarrain Sep 13 '11 at 19:56
  • 9
    @glarrin, correct - KeyError means that PYTHONPATH is not defined. It won't be a problem because there's already default paths set up, see `sys.path`. – Mark Ransom Sep 13 '11 at 20:03
  • I'm not seeing an answer here to solve the `PYTHONPATH` `KeyError` error. Do I need to define `PYTHONPATH` in relation to `sys.path`? – MikeiLL Jul 08 '14 at 00:16
  • @MikeiLL you're right, I've edited the answer to include that. If there's no `PYTHONPATH` then the user didn't specify one and an empty list is the proper result. If you're more interested in the list that includes the defaults use `sys.path` instead. – Mark Ransom Jul 08 '14 at 00:43
  • Thanks, Mark. You might even want to add `print user_paths` to the code. Also I found this link to be enlightening as far as PYTHONPATH: http://www.stereoplex.com/blog/understanding-imports-and-pythonpath – MikeiLL Jul 08 '14 at 16:26
19

Can't seem to edit the other answer. Has a minor error in that it is Windows-only. The more generic solution is to use os.pathsep as below:

sys.path might include items that aren't specifically in your PYTHONPATH environment variable. To query the variable directly, use:

import os
os.environ.get('PYTHONPATH', '').split(os.pathsep)
Vitali
  • 3,411
  • 2
  • 24
  • 25
  • 7
    For future readers: `os.sep` returns the directory separator for the operating system, e.g. `/`. The separator used in the Python path is different, and returned by `os.pathsep` as shown in the accepted answer. – Paul D. Waite May 22 '10 at 10:35
  • 1
    Thanks for the fix. I always get them mixed up when writing code by hand. – Vitali Mar 31 '22 at 18:02
10

PYTHONPATH is an environment variable whose value is a list of directories. Once set, it is used by Python to search for imported modules, along with other std. and 3rd-party library directories listed in Python's "sys.path".

As any other environment variables, you can either export it in shell or in ~/.bashrc, see here. You can query os.environ['PYTHONPATH'] for its value in Python as shown below:

$ python3 -c "import os, sys; print(os.environ['PYTHONPATH']); print(sys.path) if 'PYTHONPATH' in sorted(os.environ) else print('PYTHONPATH is not defined')"

IF defined in shell as

$ export PYTHONPATH=$HOME/Documents/DjangoTutorial/mysite

THEN result =>

/home/Documents/DjangoTutorial/mysite
['', '/home/Documents/DjangoTutorial/mysite', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']

ELSE result =>

PYTHONPATH is not defined

To set PYTHONPATH to multiple paths, see here.

Note that one can add or delete a search path via sys.path.insert(), del or remove() at run-time, but NOT through os.environ[]. Example:

>>> os.environ['PYTHONPATH']="$HOME/Documents/DjangoTutorial/mysite"
>>> 'PYTHONPATH' in sorted(os.environ)
True
>>> sys.path // but Not there
['', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']

>>> sys.path.insert(0,os.environ['PYTHONPATH'])
>>> sys.path // It's there
['$HOME/Documents/DjangoTutorial/mysite', '', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']
>>> 

In summary, PYTHONPATH is one way of specifying the Python search path(s) for imported modules in sys.path. You can also apply list operations directly to sys.path without the aid of PYTHONPATH.

Leon Chang
  • 669
  • 8
  • 12
  • Being that you're using brackets and not `.get()`, if PYTHONPATH is not defined, you'll simply get a traceback error and neither the path nor "PYTHONPATH is not defined" are printed. Replace it with `print(os.environ.get('PYTHONPATH'));` and the output will default to `None` instead of failing. – Swirle13 Jan 09 '23 at 19:47
8

Works in windows 10, essentially identical to vanuan's answer, but cleaner (taken from somewhere, can't remember where..):

import sys
for p in sys.path:
    print(p)
juggler
  • 319
  • 1
  • 5
  • 16
5
import subprocess
python_path = subprocess.check_output("which python", shell=True).strip()
python_path = python_path.decode('utf-8')
Rakend Dubba
  • 119
  • 1
  • 4
  • This is not relevant to the question; `PYTHONPATH` is **not** "where Python lives", but an environment variable with additional paths to search for modules. – Karl Knechtel Jul 07 '22 at 07:16
1

Python tells me where it lives when it gives me an error message :)

>>> import os
>>> os.environ['PYTHONPATH'].split(os.pathsep)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\martin\AppData\Local\Programs\Python\Python36-32\lib\os.py", line 669, in __getitem__
    raise KeyError(key) from None
KeyError: 'PYTHONPATH'
>>>
C4rnot
  • 49
  • 1
  • This is not relevant to the question; `PYTHONPATH` is **not** "where Python lives", but an environment variable with additional paths to search for modules. – Karl Knechtel Jul 07 '22 at 07:14
0

If using conda, you can get the env prefix using os.environ["CONDA_PREFIX"].

Sandro Braun
  • 167
  • 7
-1
import sys
for a in sys.path:
    a = a.replace('\\\\','\\')
    print(a)

It will give all the paths ready for place in the Windows.

  • Calling `.replace` on a string *does not modify the string*, but instead creates a *new* one which is ignored in this code. Not that it matters, because there is no good reason to unescape the backslashes anyway. Path strings from `sys.path` are usable on that system as is. – Karl Knechtel Jul 07 '22 at 07:16
-2

Use the command,

$ which python

remember to enter this in the correct environment so use:

$ conda activate <env>

or

$ mamba activate <env>

If you do not have a conda environment, $ which python or $ which python3 would do just fine.

  • Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Mar 07 '22 at 04:54
  • This is not relevant to the question; `PYTHONPATH` is **not** "where Python lives", but an environment variable with additional paths to search for modules. – Karl Knechtel Jul 07 '22 at 07:14