1207

如何找到我的站点包目录的位置?

4

22 回答 22

837

有两种类型的站点包目录,全局每个用户

  1. 运行时会列出全局站点包(“ dist-packagessys.path ”)目录:

    python -m site
    

    getsitepackages要从Python 代码中的站点模块运行更简洁的列表:

    python -c 'import site; print(site.getsitepackages())'
    

    注意:使用 virtualenvs getsitepackages is not available,尽管如此,sys.path上面将正确列出 virtualenv 的 site-packages 目录。在 Python 3 中,您可以改用sysconfig 模块

    python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])'
    
  2. 每个用户的站点包目录(PEP 370)是 Python 安装本地包的位置:

    python -m site --user-site
    

    如果这指向一个不存在的目录,请检查 Python 的退出状态并查看python -m site --help解释。

    提示:运行pip list --userpip freeze --user为您提供每个用户安装的所有站点包的列表。


实用技巧

  • <package>.__path__让您识别特定包裹的位置:(详细信息

    $ python -c "import setuptools as _; print(_.__path__)"
    ['/usr/lib/python2.7/dist-packages/setuptools']
    
  • <module>.__file__让您识别特定模块的位置:(差异

    $ python3 -c "import os as _; print(_.__file__)"
    /usr/lib/python3.6/os.py
    
  • 运行pip show <package>以显示 Debian 风格的软件包信息:

    $ 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
    
于 2017-09-06T09:24:00.913 回答
687
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

(或只是第一个项目site.getsitepackages()[0]

于 2012-10-18T08:19:45.187 回答
351

一个解决方案:

  • 在 virtualenv 之外 - 提供全局站点包的路径,
  • insidue a virtualenv - 提供virtualenv 的站点包

...这是单行:

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 安装有用)

于 2008-09-23T17:06:59.080 回答
106

对于 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,您可能可以安全地将第一个代码框复制粘贴到终端中。

于 2011-01-06T03:08:09.357 回答
75

这对我有用:

python -m site --user-site
于 2012-05-22T00:08:55.807 回答
43

现代标准库方法是使用sysconfig模块,在 2.7 和 3.2+ 版本中可用。与当前接受的答案不同,无论您是否激活了虚拟环境,此方法仍然有效。

注意:(source )不要与此处其他几个答案中提到的子模块(sysconfigsource 混淆。后者是一个完全不同的模块,它缺少下面讨论的功能。distutils.sysconfigget_paths

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

使用 venv,你会得到这样的东西

# 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
于 2018-10-04T04:11:48.300 回答
34

假设您已经安装了包“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,你可以做同样的事情。

这是给雪豹的。但我认为它通常也应该起作用。

于 2011-02-23T18:32:10.357 回答
25

正如其他人所指出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 将用于安装,并且您的程序可能在 virtualenv 中运行,您的 pythonpath 完全是用户本地的,因此它也不应该直接使用系统站点包。

于 2008-09-23T17:14:02.557 回答
23

在基于 Debian 的系统中使用 python 安装安装的本机系统包可以在以下位置找到:

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

在 OSX -/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']
于 2013-08-08T16:05:17.297 回答
18

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])")
于 2019-01-03T09:59:11.173 回答
14

附注:建议的解决方案 ( distutils.sysconfig.get_python_lib()) 在有多个站点包目录时不起作用(如本文所推荐的那样)。它只会返回主站点包目录。

唉,我也没有更好的解决方案。Python 似乎不跟踪站点包目录,只跟踪其中的包。

于 2009-11-10T22:49:28.780 回答
14

所有答案(或:一遍又一遍地重复相同的答案)都是不充分的。你想要做的是:

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

最后一行显示安装目录。可以在 Ubuntu 上运行,而上面的则不行。不要问我有关 windows 或其他 dist 的问题,但由于它与 easy_install 默认使用的目录完全相同,因此它可能在 easy_install 工作的任何地方都是正确的(所以,在任何地方,甚至是 mac)。玩得开心。注意:原始代码中有很多脏话。

于 2012-02-06T02:40:22.307 回答
13

这对我有用。它将为您提供 dist-packages 和 site-packages 文件夹。如果该文件夹不在 Python 的路径上,那么无论如何它都不会对您有多大好处。

import sys; 
print [f for f in sys.path if f.endswith('packages')]

输出(Ubuntu 安装):

['/home/username/.local/lib/python2.7/site-packages',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages']
于 2012-03-30T16:01:24.873 回答
13

由于其“低技术”性质,这应该适用于进出虚拟环境的所有发行版。os 模块始终位于“site-packages”的父目录中

import os; print(os.path.dirname(os.__file__) + '/site-packages')

要将 dir 更改为 site-packages 目录,我使用以下别名(在 *nix 系统上):

alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
于 2015-03-15T15:43:40.320 回答
12

对已经提到的功能的附加说明get_python_lib:在某些平台上,不同的目录用于特定于平台的模块(例如:需要编译的模块)。如果您传递plat_specific=True给该函数,您将获得平台特定包的站点包。

于 2008-09-23T17:16:22.833 回答
10
from distutils.sysconfig import get_python_lib
print get_python_lib()
于 2008-09-23T17:09:54.563 回答
7

您应该尝试使用此命令来确定 pip 的安装位置

蟒蛇2

pip show six | grep "Location:" | cut -d " " -f2

蟒蛇3

pip3 show six | grep "Location:" | cut -d " " -f2
于 2019-05-06T19:15:12.200 回答
4

回答老问题。但是为此使用 ipython。

pip install ipython
ipython 
import imaplib
imaplib?

这将给出关于 imaplib 包的以下输出 -

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
于 2016-07-18T09:12:47.957 回答
2

对于那些使用诗歌的人,您可以通过以下方式找到您的虚拟环境路径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

使用此信息,您可以列出站点包:

ls /Users/cglacet/.pyenv/versions/3.8.2/envs/my-virtualenv/lib/python3.8/site-packages/
于 2020-11-19T18:33:42.673 回答
2

我做了一个非常简单的函数来完成工作

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'

如果要使用终端检索结果:

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


于 2021-07-18T07:15:15.723 回答
1

我必须为我正在处理的项目做一些稍微不同的事情:找到相对于基本安装前缀的相对站点包目录。如果 site-packages 文件夹位于 中/usr/lib/python2.7/site-packages,我想要该/lib/python2.7/site-packages部分。事实上,我遇到了site-packagesin的系统/usr/lib64,并且接受的答案在这些系统上不起作用。

与作弊者的回答类似,我的解决方案深入 Distutils 的内部,以找到实际在内部传递的路径setup.py。弄清楚我不想让任何人再次弄清楚这一点真是太痛苦了。

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

那应该打印类似/Lib/site-packagesor的东西/lib/python3.6/site-packages

于 2017-12-16T09:49:25.617 回答
0

一些我认为有用的没有提到的东西,如果你安装了两个版本的 Python,例如 3.8 和 3.5,你的机器上可能有两个名为 site-packages 的文件夹。在这种情况下,您可以使用以下命令指定 python 版本:

py -3.5 -c "import site; print(site.getsitepackages()[1])
于 2020-09-16T15:42:56.223 回答