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

- 11,289
- 20
- 44
- 72

- 96,640
- 56
- 199
- 270
-
30I'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
-
7The 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
-
8Don't forget about `python -m site`. – Andrew McKinlay Jul 02 '18 at 15:15
10 Answers
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
.

- 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
-
8This is the platform- and environment- independent way to get the current runtime's python path. – Dmitry Minkovsky Nov 29 '12 at 19:06
-
18This 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
-
-
-
@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
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 = []

- 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
-
5os.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
-
2And 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
-
14And 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
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)

- 3,411
- 2
- 24
- 25
-
7For 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
-
1Thanks for the fix. I always get them mixed up when writing code by hand. – Vitali Mar 31 '22 at 18:02
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.

- 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
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)

- 319
- 1
- 5
- 16
-
1This one line does the same job `import sys; print('\n'.join(sys.path))` – PM0087 Feb 15 '22 at 09:44
import subprocess
python_path = subprocess.check_output("which python", shell=True).strip()
python_path = python_path.decode('utf-8')

- 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
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'
>>>

- 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
import sys
for a in sys.path:
a = a.replace('\\\\','\\')
print(a)
It will give all the paths ready for place in the Windows.

- 1
- 2
-
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
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.

- 25
- 1
-
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