How do I find the location of my site-packages directory?
23 Answers
There are two types of site-packages directories, global and per user.
Global site-packages ("dist-packages") directories are listed in
sys.pathwhen you run:python -m siteFor a more concise list run
getsitepackagesfrom the site module in Python code:python -c 'import site; print(site.getsitepackages())'Caution: In virtual environments getsitepackages is not available with older versions of
virtualenv,sys.pathfrom above will list the virtualenv's site-packages directory correctly, though. In Python 3, you may use the sysconfig module instead:python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])'The per user site-packages directory (PEP 370) is where Python installs your local packages:
python -m site --user-siteIf this points to a non-existing directory check the exit status of Python and see
python -m site --helpfor explanations.Hint: Running
pip list --userorpip freeze --usergives you a list of all installed per user site-packages.
Practical Tips
<package>.__path__lets you identify the location(s) of a specific package: (details)$ python -c "import setuptools as _; print(_.__path__)" ['/usr/lib/python2.7/dist-packages/setuptools']<module>.__file__lets you identify the location of a specific module: (difference)$ python3 -c "import os as _; print(_.__file__)" /usr/lib/python3.6/os.pyRun
pip show <package>to show Debian-style package information:$ pip show pytest Name: pytest Version: 3.8.2 Summary: pytest: simple powerful testing with Python Home-page: https://docs.pytest.org/en/latest/ Author: Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, Floris Bruynooghe, Brianna Laugher, Florian Bruhin and others Author-email: None License: MIT license Location: /home/peter/.local/lib/python3.4/site-packages Requires: more-itertools, atomicwrites, setuptools, attrs, pathlib2, six, py, pluggy
10 Comments
python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())" (it works on both Python 2 and 3 too).python -c "import site; print(site.getsitepackages()[0])">>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
(or just first item with site.getsitepackages()[0])
10 Comments
hasattr(sys,'real_prefix') and then determine site packages heuristically from [p for p in sys.path if p.endswith('site-packages')][-1] (plus check if there is one found before doing the [-1].A solution that:
- outside of virtualenv - provides the path of global site-packages,
- insidue a virtualenv - provides the virtualenv's site-packages
...is this one-liner:
python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
Formatted for readability (rather than use as a one-liner), that looks like the following:
from distutils.sysconfig import get_python_lib
print(get_python_lib())
Source: an very old version of "How to Install Django" documentation (though this is useful to more than just Django installation)
8 Comments
cdsitepackages, to directly change into the environment's site-packages directory./usr/lib/python3/dist-packages instead of /usr/lib/python3.5/dist-packages.For Ubuntu,
python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
...is not correct.
It will point you to /usr/lib/pythonX.X/dist-packages
This folder only contains packages your operating system has automatically installed for programs to run.
On ubuntu, the site-packages folder that contains packages installed via setup_tools\easy_install\pip will be in /usr/local/lib/pythonX.X/dist-packages
The second folder is probably the more useful one if the use case is related to installation or reading source code.
If you do not use Ubuntu, you are probably safe copy-pasting the first code box into the terminal.
3 Comments
module.__file__ is the better way. If they're trying to install things… just use the tools.'/usr/lib/pythonX.X/dist-packages' in site.getsitepackages() on Ubuntu (though it goes after /usr/local/... in the list). You only get something into /usr/local via sudo pip and you shouldn't use sudo pip on Ubuntu unless you decided to make your own distribution: if you use sudo pip, it is your responsibility to make sure that all dependencies of the current and future python modules installed via sudo apt or sudo pip are compatible. Consider what problem virtualenv was created to solvepython -c "from distutils.sysconfig import get_python_lib; print get_python_lib()", I get ModuleNotFoundError: No module named 'requests_unixsocket'This is what worked for me:
python -m site --user-site
8 Comments
~/.local/lib/python2.7/site-packages).virtualenv it complains that the package does not exist. how do i invoke the packages installed at a custom location?TL;DR:
import sysconfig
print(sysconfig.get_path("purelib"))
A modern stdlib way is using sysconfig module, available in version 2.7 and 3.2+. Unlike the current accepted answer, this method still works regardless of whether or not you have a virtual environment active.
Note: sysconfig (source) is not to be confused with the distutils.sysconfig submodule (source) mentioned in several other answers here. The latter is an entirely different module and it's lacking the get_paths function discussed below. Additionally, distutils was deprecated in Python 3.10 and removed in Python 3.12.
Python currently uses eight paths (docs):
- stdlib: directory containing the standard Python library files that are not platform-specific.
- platstdlib: directory containing the standard Python library files that are platform-specific.
- platlib: directory for site-specific, platform-specific files.
- purelib: directory for site-specific, non-platform-specific files.
- include: directory for non-platform-specific header files.
- platinclude: directory for platform-specific header files.
- scripts: directory for script files.
- data: directory for data files.
In most cases, users finding this question would be interested in the 'purelib' path (in some cases, you might be interested in 'platlib' too). The purelib path is where ordinary Python packages will be installed by tools like pip.
At system level, you'll see something like this:
# Linux
$ python3 -c "import sysconfig; print(sysconfig.get_path('purelib'))"
/usr/local/lib/python3./site-packages
# Linux (Ubuntu/Debian based)
$ python3 -c "import sysconfig; print(sysconfig.get_path('purelib'))"
/usr/local/lib/python3.12/dist-packages
# macOS (official python.org installer)
$ python3 -c "import sysconfig; print(sysconfig.get_path('purelib'))"
/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages
# macOS (brew installed [email protected])
$ python3 -c "import sysconfig; print(sysconfig.get_path('purelib'))"
/usr/local/lib/python3.12/site-packages
# Windows
C:\> py -c "import sysconfig; print(sysconfig.get_path('purelib'))"
C:\Users\wim\AppData\Local\Programs\Python\Python312\Lib\site-packages
With a venv, you'll get something like this
# Linux
/tmp/.venv/lib/python3.12/site-packages
# macOS
/private/tmp/.venv/lib/python3.12/site-packages
# Windows
C:\Users\wim\AppData\Local\Temp\.venv\Lib\site-packages
The function sysconfig.get_paths() returns a dict of all of the relevant installation paths, example on Linux:
>>> import sysconfig
>>> sysconfig.get_paths()
{'stdlib': '/usr/local/lib/python3.12',
'platstdlib': '/usr/local/lib/python3.12',
'purelib': '/usr/local/lib/python3.12/site-packages',
'platlib': '/usr/local/lib/python3.12/site-packages',
'include': '/usr/local/include/python3.12',
'platinclude': '/usr/local/include/python3.12',
'scripts': '/usr/local/bin',
'data': '/usr/local'}
A shell script is also available to display these details, which you can invoke by executing sysconfig as a module:
python -m sysconfig
Addendum: What about Debian / Ubuntu?
Note: Previously, Debian-based distributions had inaccurate installation paths returned by sysconfig, but paths are correctly reported for these distros now. I'll leave this section here for historical context on what was wrong, but know that recent versions of Debian / Ubuntu seem to have resolved the issue.
As some commenters point out, the sysconfig results for Debian systems (and Ubuntu, as a derivative) are not accurate. When a user pip installs a package it will go into dist-packages not site-packages, as per Debian policies on Python packaging.
The root cause of the discrepancy is because Debian patch the distutils install layout, to correctly reflect their changes to the site, but they fail to patch the sysconfig module.
For example, on Ubuntu 20.04.4 LTS (Focal Fossa):
root@cb5e85f17c7f:/# python3 -m sysconfig | grep packages
platlib = "/usr/lib/python3.8/site-packages"
purelib = "/usr/lib/python3.8/site-packages"
root@cb5e85f17c7f:/# python3 -m site | grep packages
'/usr/local/lib/python3.8/dist-packages',
'/usr/lib/python3/dist-packages',
USER_SITE: '/root/.local/lib/python3.8/site-packages' (doesn't exist)
It looks like the patched Python installation that Debian/Ubuntu are distributing is a bit hacked up, and they will need to figure out a new plan for 3.12+ when distutils is completely unavailable. Probably, they will have to start patching sysconfig as well, since this is what pip will be using for install locations.
11 Comments
platlib, as e.g. /usr/local/lib/python3.6/site-packages? Traditionally, locally-installed things should go in /usr/local.sysconfig module does not produce correct paths on Debian/Ubuntu and derivatives, whereas the distutils.sysconfig module does.Let's say you have installed the package 'django'. import it and type in dir(django). It will show you, all the functions and attributes with that module. Type in the python interpreter -
>>> import django
>>> dir(django)
['VERSION', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'get_version']
>>> print django.__path__
['/Library/Python/2.6/site-packages/django']
You can do the same thing if you have installed mercurial.
This is for Snow Leopard. But I think it should work in general as well.
4 Comments
django.__file__ for this rather than __path__. and, no, it's not a guarantee that this has anything to do with site-packages, but with things like django, that you've most likely pip installed, it will do when you're in a hurry and it can be used for other purposes as well (reading a default config file from the file system for example).foo.bar package: python -c "import foo.bar as _; print(_.__path__[0])"As others have noted, distutils.sysconfig has the relevant settings:
import distutils.sysconfig
print distutils.sysconfig.get_python_lib()
...though the default site.py does something a bit more crude, paraphrased below:
import sys, os
print os.sep.join([sys.prefix, 'lib', 'python' + sys.version[:3], 'site-packages'])
(it also adds ${sys.prefix}/lib/site-python and adds both paths for sys.exec_prefix as well, should that constant be different).
That said, what's the context? You shouldn't be messing with your site-packages directly; setuptools/distutils will work for installation, and your program may be running in a virtualenv where your pythonpath is completely user-local, so it shouldn't assume use of the system site-packages directly either.
3 Comments
python2 on osx and ubuntu with and without virtualenv but not with python3 at all.python3.pip show will give all the details about a package: https://pip.pypa.io/en/stable/reference/pip_show/ [pip show][1]
To get the location:
pip show <package_name>| grep Location
In Linux, you can go to site-packages folder by:
cd $(python -c "import site; print(site.getsitepackages()[0])")
2 Comments
pip3 show foo | grep Location | cut -d ' ' -f 2findstr instead of grep works. So, python -m pip show numpy | findstr "Location" gives Location: c:\users\bballdave025\appdata\local\programs\python\python38\lib\site-packages. Modules you have installed with pip are in site packages. You can be pretty sure site-packages is the location of pip itself - as called with python -m pip .... So, python -m pip show pip | findstr "Location" shows the same path to site-packages we got from numpy. Besides pip, you can almost always try virtualenv (venv) & setuptools, for NIX *or WinThe native system packages installed with python installation in Debian based systems can be found at :
/usr/lib/python2.7/dist-packages/
In OSX - /Library/Python/2.7/site-packages
by using this small code :
from distutils.sysconfig import get_python_lib
print get_python_lib()
However, the list of packages installed via pip can be found at :
/usr/local/bin/
Or one can simply write the following command to list all paths where python packages are.
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
Note: the location might vary based on your OS, like in OSX
>>> import site; site.getsitepackages()
['/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/site-python', '/Library/Python/2.7/site-packages']
2 Comments
site.getsitepackages() from the system installation hence the dist-packages, other installations will show site-packages.All the answers (or: the same answer repeated over and over) are inadequate. What you want to do is this:
from setuptools.command.easy_install import easy_install
class easy_install_default(easy_install):
""" class easy_install had problems with the fist parameter not being
an instance of Distribution, even though it was. This is due to
some import-related mess.
"""
def __init__(self):
from distutils.dist import Distribution
dist = Distribution()
self.distribution = dist
self.initialize_options()
self._dry_run = None
self.verbose = dist.verbose
self.force = None
self.help = 0
self.finalized = 0
e = easy_install_default()
import distutils.errors
try:
e.finalize_options()
except distutils.errors.DistutilsError:
pass
print e.install_dir
The final line shows you the installation dir. Works on Ubuntu, whereas the above ones don't. Don't ask me about windows or other dists, but since it's the exact same dir that easy_install uses by default, it's probably correct everywhere where easy_install works (so, everywhere, even macs). Have fun. Note: original code has many swearwords in it.
3 Comments
easy_install and does not fail gracefully if unavailable which is inadequate :)This works for me. It will get you both dist-packages and site-packages folders. If the folder is not on Python's path, it won't be doing you much good anyway.
import sys;
print [f for f in sys.path if f.endswith('packages')]
Output (Ubuntu installation):
['/home/username/.local/lib/python2.7/site-packages',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages']
2 Comments
This should work on all distributions in and out of virtual environment due to it's "low-tech" nature. The os module always resides in the parent directory of 'site-packages'
import os; print(os.path.dirname(os.__file__) + '/site-packages')
To change dir to the site-packages dir I use the following alias (on *nix systems):
alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
2 Comments
An additional note to the get_python_lib function mentioned already: on some platforms different directories are used for platform specific modules (eg: modules that require compilation). If you pass plat_specific=True to the function you get the site packages for platform specific packages.
Comments
A side-note: The proposed solution (distutils.sysconfig.get_python_lib()) does not work when there is more than one site-packages directory (as recommended by this article). It will only return the main site-packages directory.
Alas, I have no better solution either. Python doesn't seem to keep track of site-packages directories, just the packages within them.
3 Comments
get_python_lib() when being run from within virtualenv shows site-packages of Python used to create virtualenv and not the virtualenv's site-packages.Answer to old question. But use ipython for this.
pip install ipython
ipython
import imaplib
imaplib?
This will give the following output about imaplib package -
Type: module
String form: <module 'imaplib' from '/usr/lib/python2.7/imaplib.py'>
File: /usr/lib/python2.7/imaplib.py
Docstring:
IMAP4 client.
Based on RFC 2060.
Public class: IMAP4
Public variable: Debug
Public functions: Internaldate2tuple
Int2AP
ParseFlags
Time2Internaldate
1 Comment
I had to do something slightly different for a project I was working on: find the relative site-packages directory relative to the base install prefix. If the site-packages folder was in /usr/lib/python2.7/site-packages, I wanted the /lib/python2.7/site-packages part. I have, in fact, encountered systems where site-packages was in /usr/lib64, and the accepted answer did NOT work on those systems.
Similar to cheater's answer, my solution peeks deep into the guts of Distutils, to find the path that actually gets passed around inside setup.py. It was such a pain to figure out that I don't want anyone to ever have to figure this out again.
import sys
import os
from distutils.command.install import INSTALL_SCHEMES
if os.name == 'nt':
scheme_key = 'nt'
else:
scheme_key = 'unix_prefix'
print(INSTALL_SCHEMES[scheme_key]['purelib'].replace('$py_version_short', (str.split(sys.version))[0][0:3]).replace('$base', ''))
That should print something like /Lib/site-packages or /lib/python3.6/site-packages.
Comments
For those who are using poetry, you can find your virtual environment path with poetry debug:
$ poetry debug
Poetry
Version: 1.1.4
Python: 3.8.2
Virtualenv
Python: 3.8.2
Implementation: CPython
Path: /Users/cglacet/.pyenv/versions/3.8.2/envs/my-virtualenv
Valid: True
System
Platform: darwin
OS: posix
Python: /Users/cglacet/.pyenv/versions/3.8.2
Using this information you can list site packages:
ls /Users/cglacet/.pyenv/versions/3.8.2/envs/my-virtualenv/lib/python3.8/site-packages/
Comments
I made a really simple function that gets the job done
import site
def get_site_packages_dir():
return [p for p in site.getsitepackages()
if p.endswith(("site-packages", "dist-packages"))][0]
get_site_packages_dir()
# '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages'
If you want to retrieve the results using the terminal:
python3 -c "import site;print([p for p in site.getsitepackages() if p.endswith(('site-packages', 'dist-packages')) ][0])"
/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages
Something that has not been mentioned which I believe is useful, if you have two versions of Python installed e.g. both 3.8 and 3.5 there might be two folders called site-packages on your machine. In that case you can specify the python version by using the following:
py -3.5 -c "import site; print(site.getsitepackages()[1])
Comments
Use du command
du -h --max-depth=1 <path_to_libs> | sort -rh | head -10
where
du -h --max-depth=1
-h- prints human-readable data size, like17M, or5,4G--max-depth=1- iterates only the 1st level directories
sort -rh
-h- human readable numeric sorting-r- reverse sorting (from bigger to lower values)
head -10
-10- takes only top 10 lines of the output
For instance, get the list of global python libs locations, like @Peterino suggested
python -c 'import site; print(site.getsitepackages())'
['/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages', '/usr/lib/python3.10/dist-packages']
Check each location, one by one
❯ du -h --max-depth=1 /usr/local/lib/python3.10/dist-packages | sort -rh | head -10
4,0K /usr/local/lib/python3.10/dist-packages
❯ du -h --max-depth=1 /usr/lib/python3/dist-packages | sort -rh | head -10
229M /usr/lib/python3/dist-packages
26M /usr/lib/python3/dist-packages/samba
18M /usr/lib/python3/dist-packages/yt_dlp
17M /usr/lib/python3/dist-packages/PyQt5
14M /usr/lib/python3/dist-packages/pip
7,4M /usr/lib/python3/dist-packages/pygments
6,0M /usr/lib/python3/dist-packages/reportlab
5,9M /usr/lib/python3/dist-packages/orca
5,9M /usr/lib/python3/dist-packages/Cryptodome
5,4M /usr/lib/python3/dist-packages/google
❯ du -h --max-depth=1 /usr/lib/python3.10/dist-packages | sort -rh | head -10
20K /usr/lib/python3.10/dist-packages
16K /usr/lib/python3.10/dist-packages/nemo_emblems-6.0.1.egg-info
The same with virtual environment
❯ du -h --max-depth=1 .venv/lib/python3.10/site-packages | sort -rh | head -10
5,1G .venv/lib/python3.10/site-packages
2,7G .venv/lib/python3.10/site-packages/nvidia
1,8G .venv/lib/python3.10/site-packages/tensorflow
109M .venv/lib/python3.10/site-packages/scipy
66M .venv/lib/python3.10/site-packages/pandas
62M .venv/lib/python3.10/site-packages/clang
53M .venv/lib/python3.10/site-packages/sklearn
38M .venv/lib/python3.10/site-packages/matplotlib
37M .venv/lib/python3.10/site-packages/numpy.libs
37M .venv/lib/python3.10/site-packages/numpy
Or just go to the required directory with packages and run the command there
❯ cd .venv/lib/python3.10/site-packages
❯ du -h --max-depth=1 | sort -rh | head -10
5,1G .
2,7G ./nvidia
1,8G ./tensorflow
109M ./scipy
66M ./pandas
62M ./clang
53M ./sklearn
38M ./matplotlib
37M ./numpy.libs
37M ./numpy
pip show <package name>