如何找到我的Python site-packages目录的位置?

1394

我该如何找到我的site-packages目录的位置?


120
如果您只想查找一个软件包的确切位置,则可以使用 pip show <软件包名称> - joshuakcockrell
22个回答

1069

有两种site-packages目录:全局针对每个用户的

  1. Global site-packages ("dist-packages") directories are listed in sys.path when you run:

     python -m site
    

    For a more concise list run getsitepackages from 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.path from 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"])'
    
  2. The per user site-packages directory (PEP 370) is where Python installs your local packages:

     python -m site --user-site
    

    If this points to a non-existing directory check the exit status of Python and see python -m site --help for explanations.

    Hint: Running pip list --user or pip freeze --user gives you a list of all installed per user site-packages.

实用技巧
  • <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.py
    
  • Run 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
    

26
在虚拟环境中有一个站点包目录。您可以使用 python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())" 命令获取站点特定模块的目录 (无论是在虚拟环境内还是外部都适用,此命令也适用于 Python 2 和 3)。 - jfs
6
好的,获取第一个包路径的命令是:python -c "import site; print(site.getsitepackages()[0])" - Brent Faust
4
这应该出现在任何关于使用Python的基础教程中。我已经使用Python多年了,但不知道有这个site模块。如果早些知道,就可以避免很多困惑... - salotz
1
我已经向Python官方教程提出了一项更改建议。请查看PR#16974获取详细信息,感谢@salotz的建议! - Peterino
2
我认为https://dev59.com/yHVD5IYBdhLWcg3wAGiD#52638888很容易成为这个问题的最佳答案。 - kapad
显示剩余5条评论

700
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
(或者只使用 site.getsitepackages()[0] 的第一个项)

18
这个很棒,但不幸的是,这个功能只能在Python2.7及以上版本中使用。所以,如果你正在使用Python2.7或更高版本,这是一个好的解决方案,但对于Python2.6及以下版本则无法工作。 - Dan Niero
15
python -c "import site; print(site.getsitepackages())" 可以翻译为:使用 Python 执行命令 "import site; print(site.getsitepackages())",并打印结果。 - Lars Schneider
29
在使用虚拟环境(Python 2.7.8)时,当我使用 getsitepackages 方法时出现了 AttributeError: 'module' object has no attribute 'getsitepackages' 的错误提示。然而,下面的 distutils 解决方案可以解决该问题。 - radtek
8
对于虚拟环境(venv),我通过hasattr(sys,'real_prefix')来检测venv,然后通过[p for p in sys.path if p.endswith('site-packages')][-1]的启发式方式来确定站点包(site packages),在执行[-1]之前还需要检查是否找到一个。 - eudoxos
4
已知问题:site模块在虚拟环境中无法使用 https://github.com/pypa/virtualenv/issues/355 - Guillem Cucurull
显示剩余5条评论

380

一个解决方案,它:

  • 在虚拟环境之外-提供全局site-packages的路径,
  • 在虚拟环境内-提供虚拟环境的site-packages

...就是这个一行代码:

python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"

为了更易读(而不是作为一行代码使用),它看起来像下面这样:

from distutils.sysconfig import get_python_lib
print(get_python_lib())


来源:一个非常古老的版本的“如何安装Django”文档(尽管这不仅对Django安装有用)


2
virtualenv提供了一种查找其site-packages的方法吗? - Daryl Spitzer
10
您可以使用virtualenvwrapper,它有一个名为“cdsitepackages”的命令,可以直接切换到虚拟环境的site-packages目录。 - john2x
6
对我来说,在Linux上的虚拟环境中使用Python 2.7可以正常工作。 - RichVel
2
第一个评论不再适用:这显示了虚拟环境内外的正确位置。 - astrojuanlu
3
在使用Linux Bash时,我在Windows 10上无法使用它,它返回的是/usr/lib/python3/dist-packages而不是/usr/lib/python3.5/dist-packages。请帮我看看这个问题。 - Delgan
显示剩余3条评论

109

针对Ubuntu操作系统,

python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"

这是不正确的。

它将指向/usr/lib/pythonX.X/dist-packages文件夹,该文件夹仅包含操作系统自动安装以供程序运行的软件包。

在Ubuntu上,通过setup_tools\easy_install\pip安装的软件包所在的site-packages文件夹位于/usr/local/lib/pythonX.X/dist-packages

如果使用情况与安装或阅读源代码有关,则第二个文件夹可能更有用。

如果您不使用Ubuntu,则将第一个代码框复制并粘贴到终端中可能是比较安全的。


3
如果提问者想知道特定软件包的位置,module.__file__ 是更好的方式。如果他们正在尝试安装软件包...直接使用工具即可。 - Tobu
2
在Ubuntu上,'/usr/lib/pythonX.X/dist-packages' in site.getsitepackages() 位于列表中 /usr/local/... 之后。你只能通过 sudo pip 将某些东西放入 /usr/local 中,并且在Ubuntu上不应该使用 sudo pip,除非你决定制作自己的发行版:如果你使用 sudo pip,则有责任确保通过 sudo aptsudo pip 安装的当前和未来 python 模块的所有依赖项都是兼容的。请考虑 创建 virtualenv 的原因 - jfs
python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()", I get ModuleNotFoundError: No module named 'requests_unixsocket' - Timo

85

这是对我有效的解决方法:

python -m site --user-site

20
对我来说,这意味着一个甚至不存在的文件夹 (~/.local/lib/python2.7/site-packages)。 - Neil Traft
2
在OS X Mavericks中,我的主目录.local并不是我想要找到的,而且实际上它也不存在。 - radtek
它在我的主要 /Library 文件夹中,我不得不手动导航到它,因为某种原因直接的完整路径无法工作。 - ericjam
我该如何使用这里安装的包?如果我使用 virtualenv,它会抱怨该包不存在。我该如何调用自定义位置安装的包? - AbtPst
3
这告诉你Python将在哪里查找用户特定的包。在这种情况下,“不存在”和“不是我想要找到的”等评论是没有意义的。 - Honest Abe
显示剩余3条评论

69
一种现代的标准库方法是使用sysconfig模块,该模块在2.7版本和3.2+版本中可用。与当前被接受的答案不同,这种方法仍然适用,无论您是否激活了虚拟环境。
注意:不要将sysconfigsource)与其他答案中提到的distutils.sysconfig子模块(source)混淆。后者是一个完全不同的模块,缺少下面讨论的get_paths函数。此外,distutils在Python 3.10中已被弃用,并在Python 3.12中移除
Python目前使用八个路径(docs):
- stdlib:包含非平台特定的标准Python库文件的目录。 - platstdlib:包含平台特定的标准Python库文件的目录。 - platlib:用于站点特定的、平台特定的文件的目录。 - purelib:用于站点特定的、非平台特定的文件的目录。 - include:用于非平台特定的头文件的目录。 - platinclude:用于平台特定的头文件的目录。 - scripts:用于脚本文件的目录。 - data:用于数据文件的目录。
在大多数情况下,找到这个问题的用户会对 'purelib' 路径感兴趣(在某些情况下,您可能也对 'platlib' 感兴趣)。'purelib' 路径是普通 Python 包将被像 pip 这样的工具安装的地方。
在系统级别上,您会看到类似这样的内容:
# Linux
$ python3 -c "import sysconfig; print(sysconfig.get_path('purelib'))"
/usr/local/lib/python3.8/site-packages

# macOS (brew installed python3.8)
$ python3 -c "import sysconfig; print(sysconfig.get_path('purelib'))"
/usr/local/Cellar/python@3.8/3.8.3/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages

# Windows
C:\> py -c "import sysconfig; print(sysconfig.get_path('purelib'))"
C:\Users\wim\AppData\Local\Programs\Python\Python38\Lib\site-packages

使用虚拟环境,你会得到类似这样的东西
# Linux
/tmp/.venv/lib/python3.8/site-packages

# macOS
/private/tmp/.venv/lib/python3.8/site-packages

# Windows
C:\Users\wim\AppData\Local\Temp\.venv\Lib\site-packages

函数sysconfig.get_paths()返回一个包含所有相关安装路径的字典,例如在Linux上:
>>> import sysconfig
>>> sysconfig.get_paths()
{'stdlib': '/usr/local/lib/python3.8',
 'platstdlib': '/usr/local/lib/python3.8',
 'purelib': '/usr/local/lib/python3.8/site-packages',
 'platlib': '/usr/local/lib/python3.8/site-packages',
 'include': '/usr/local/include/python3.8',
 'platinclude': '/usr/local/include/python3.8',
 'scripts': '/usr/local/bin',
 'data': '/usr/local'}

还有一个可用的shell脚本来显示这些详细信息,你可以通过执行sysconfig作为一个模块来调用它。
python -m sysconfig

附录:Debian / Ubuntu怎么样?

正如一些评论者所指出的那样,Debian系统(以及作为其派生版本的Ubuntu)的sysconfig结果并不准确。当用户使用pip安装软件包时,它将被安装到dist-packages而不是site-packages,根据Debian关于Python打包的政策

这种差异的根本原因是因为Debian修补了distutils的安装布局,以正确反映他们对站点的更改,但他们未能修补sysconfig模块。

例如,在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)

看起来Debian/Ubuntu正在分发的补丁Python安装有点混乱,他们需要找出一个新的计划来处理3.12+版本,因为distutils将完全不可用。很可能,他们还需要开始修补sysconfig,因为这是pip将用于安装位置的工具。

1
这是一个很好的答案,我很高兴新的sysconfig模块使这更容易了。有没有办法获取本地前缀platlib,例如/usr/local/lib/python3.6/site-packages?传统上,本地安装的东西应该放在/usr/local中。 - eudoxos
在使用 --system-site-packages 创建的 venv 中,这不会列出所有搜索的目录 - 特别是仍然被搜索的系统站点目录在此处未列出... - T S
3
很不幸,这个答案有一个致命的缺陷:sysconfig 模块在 Debian/Ubuntu 及其衍生版本上无法生成正确的路径,而 distutils.sysconfig 模块可以。 - rdb
1
@Alleo 在调查这个发行版的情况后,为答案添加了一个附录。简直是一罐蛆虫。以下是 Debian 在 Python 中搞砸的一长串事情清单。链接 - wim
显示剩余4条评论

37

假设您已经安装了包'django'。导入它并键入dir(django)。它将显示该模块的所有函数和属性。在Python解释器中键入 -

>>> import django
>>> dir(django)
['VERSION', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'get_version']
>>> print django.__path__
['/Library/Python/2.6/site-packages/django']

如果您已安装mercurial,您也可以做同样的事情。

这是适用于Snow Leopard的。但我认为它通常也适用。


import pg print pg.path 最近的调用记录(Traceback)(最近的是最先显示的): 文件 "<stdin>", 行 1, in <module> AttributeError: 'module'对象没有属性'path'
- Dannid
它可以工作,我需要找到sklearn包并将其添加到PYDEV路径中,谢谢。 - berkay
请使用 django.__file__ 而不是 __path__。并且,这并不保证与 site-packages 有任何关系,但对于像 Django 这样的东西,你很可能已经通过 pip 安装,当你匆忙时它会派上用场,并且也可以用于其他目的(例如从文件系统读取默认配置文件)。 - JL Peyret
基于这个和其他答案,您可以在命令行中通过一行代码获取您的 foo.bar 包的路径:python -c "import foo.bar as _; print(_.__path__[0])" - snark

29

就像其他人已经指出的那样,distutils.sysconfig具有相关的设置:

import distutils.sysconfig
print distutils.sysconfig.get_python_lib()

...虽然默认的site.py做法有点粗糙,可以简述如下:

import sys, os
print os.sep.join([sys.prefix, 'lib', 'python' + sys.version[:3], 'site-packages'])

它还添加了${sys.prefix}/lib/site-python路径,并在sys.exec_prefix的两个路径中都添加了这些路径(如果该常量不同的话)。

话虽如此,背景是什么?您不应直接操作site-packages;setuptools/distutils适用于安装,您的程序可能在虚拟环境中运行,其中pythonpath完全是用户本地的,因此它也不应假定直接使用系统site-packages。


3
可以在OSX和Ubuntu上使用python2,无论是否使用virtualenv都非常可靠,但是完全不能在python3上工作。 - jitter
2
2008年已经过去了一段时间——这个答案是在Python 3.0发布前三个月给出的。 - Charles Duffy
当然,但今天我的评论可能会有所帮助。如果我错了,请纠正我。此外,我没有对关于python3的任何答案或其他答案进行投票。 - jitter

26

使用pip show命令可以获取有关软件包的所有详细信息:https://pip.pypa.io/en/stable/reference/pip_show/ [pip show][1]

要获取软件包的位置:

pip show <package_name>| grep Location

在Linux中,您可以通过以下方式进入site-packages文件夹:

cd $(python -c "import site; print(site.getsitepackages()[0])")

将OS X的“cut”命令添加到末尾,即可获得字符串:pip3 show foo | grep Location | cut -d ' ' -f 2 - cmaceachern
cut 是 GNU 核心工具 https://www.gnu.org/software/coreutils/manual/html_node/The-cut-command.html - xcvbn
在 Windows 上必须使用时,使用 findstr 而不是 grep。 因此,python -m pip show numpy | findstr "Location" 可以得到 Location: c:\users\bballdave025\appdata\local\programs\python\python38\lib\site-packages。 你用 pip 安装的模块在 site packages 中。你可以相当确定的是,在被 python -m pip ... 调用时,site-packages 即为 pip 的位置。 因此,python -m pip show pip | findstr "Location" 显示的路径与我们从 numpy 得到的路径相同。除了 pip,你也可以尝试在 NIX 或 Win 中使用 virtualenv (venv) 和 setuptools - bballdave025

25

在基于Debian的系统中,使用Python安装时安装的原生系统包可以在以下位置找到:

/usr/lib/python2.7/dist-packages/

在OS X上 - /Library/Python/2.7/site-packages

您可以使用以下简短代码进行操作:

from distutils.sysconfig import get_python_lib
print get_python_lib()

然而,通过pip安装的软件包列表可以在以下位置找到:

/usr/local/bin/

或者可以简单地输入以下命令来列出所有Python软件包所在的路径。

>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

注意:位置可能因您的操作系统而异,例如在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']

如果我没记错的话,dist-packages 是特定于 Debian 及其衍生版本的。 - Samuel
1
@SamuelSantana 您是正确的。dist-packages 是特定于基于 Debian 的系统的。在这种情况下,我从系统安装中调用了 site.getsitepackages(),因此显示了 dist-packages,其他安装将显示 site-packages。 - fnatic_shank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接