eud*_*xos 642

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

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

  • 我得到了AttributeError:'module'对象在使用virtualenv(python 2.7.8)时没有属性'getsitepackages',但是下面的distutils解决方案有效. (29认同)
  • 这很好,但不幸的是,这个功能只能从python2.7获得.所以,如果你使用python2.7或更高版本,但不适用于python 2.6及更低版本,那么很好的解决方案 (17认同)
  • python -c"import site; print(site.getsitepackages())" (14认同)
  • @radtek:对于venv,我通过`hasattr(sys,'real_prefix')`检测venv,然后从`[p为sys.path中的p,p如果p.endswith('site-packages')] [ - 启发式确定网站包] 1]`(加上检查在执行`[-1]`之前是否找到了一个. (8认同)
  • @radtek这是一个已知的错误,网站模块不适用于virtualenv https://github.com/pypa/virtualenv/issues/355 (4认同)

Pet*_*ino 396

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

  1. 运行时会列出全局站点包(" dist-packages ")目录sys.path:

    python -m site
    
    Run Code Online (Sandbox Code Playgroud)

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

    python -c "import site; print(site.getsitepackages())"
    
    Run Code Online (Sandbox Code Playgroud)

    注意:使用virtualenvs时,getitepackages不可用,sys.path但从上面可以正确列出virtualenv的site-packages目录.

  2. 每个用户站点包目录(PEP 370)是其中的Python安装本地套餐:

    python -m site --user-site
    
    Run Code Online (Sandbox Code Playgroud)

    如果这指向不存在的目录,请检查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']
    
    Run Code Online (Sandbox Code Playgroud)
  • <module>.__file__让您识别特定模块的位置:( 差异)

    $ python3 -c "import os as _; print(_.__file__)"
    /usr/lib/python3.6/os.py
    
    Run Code Online (Sandbox Code Playgroud)
  • 运行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
    
    Run Code Online (Sandbox Code Playgroud)

  • virtualenv中有一个站点包目录.您可以使用distutils.sysconfig中的[`python -c"导入get_python_lib; print(get_python_lib())"`](/sf/answers/8563831/)获取virtualenv内部/外部特定于站点的模块的目录4279)(它也适用于Python 2和3). (14认同)
  • 尼斯.并得到第一个:`python -c"导入网站; print(site.getsitepackages()[0])"` (2认同)
  • 这应该出现在任何使用 python 的基础教程中。我已经使用 python 多年了,但不知道 site 模块。本来可以省去很多头痛的事... (2认同)
  • 我认为 /sf/answers/3684722191/ 很容易是这个问题的最佳答案。 (2认同)

Dar*_*zer 312

"如何安装Django"文档(虽然这不仅仅是Django安装有用) - 从shell执行以下命令:

python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
Run Code Online (Sandbox Code Playgroud)

格式化为可读性(而不是用作单行),如下所示:

from distutils.sysconfig import get_python_lib
print(get_python_lib())
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用virtualenvwrapper(具有命令`cdsitepackages`)直接更改为环境的site-packages目录. (10认同)
  • @PiotrDobrogost:在Linux上的virtualenv中为我的Python 2.7工作 (6认同)
  • virtualenv 是否提供了查找其站点包的方法? (2认同)
  • 第一条评论不再适用:这显示了virtualenv外部和内部的正确位置. (2认同)
  • 在使用Linux bash的Windows 10上对我不起作用,它返回`/ usr / lib / python3 / dist-packages`而不是`/ usr / lib / python3.5 / dist-packages`。 (2认同)
  • 答案已经过时 - distutils 现在已[已弃用](https://peps.python.org/pep-0632/)。 (2认同)

小智 99

对于Ubuntu,

python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
Run Code Online (Sandbox Code Playgroud)

...是不正确的.

它会指向你 /usr/lib/pythonX.X/dist-packages

此文件夹仅包含操作系统自动安装的程序包以供程序运行.

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

如果用例与安装或读取源代码相关,则第二个文件夹可能更有用.

如果您不使用Ubuntu,您可能会安全地将第一个代码框复制粘贴到终端中.

  • 如果提问者在特定包裹的位置之后,`module .__ file__`是更好的方法.如果他们正在尝试安装东西......只需使用工具即可. (3认同)
  • Ubuntu 上 site.getsitepackages()` 中的“/usr/lib/pythonX.X/dist-packages”(尽管它位于列表中“/usr/local/...”*之后)。您只能通过“sudo pip”将某些内容放入“/usr/local”,并且您不应该在 Ubuntu 上使用“sudo pip”,除非您决定制作自己的发行版:如果您使用“sudo pip”,则您有责任确保通过 `sudo apt` 或 `sudo pip` 安装的当前和*未来* python 模块的所有依赖项都是兼容的。考虑[创建‘virtualenv’是为了解决什么问题](https://virtualenv.pypa.io/en/stable/#introduction) (2认同)

小智 68

这对我有用:

python -m site --user-site
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,这指向一个甚至不存在的文件夹(`〜/ .local/lib/python2.7/site-packages`). (14认同)
  • 同样,在 OS X Mavericks 中,我的 home .local 不是我想要它找到的东西,而且是的,它实际上并不在那里。 (2认同)
  • 这告诉您Python将在哪里查找特定于用户的包.像"不存在"和"不是我想要它找到的"这样的评论在这种情况下没有意义. (2认同)

Sum*_*mod 25

假设你已经安装了'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']
Run Code Online (Sandbox Code Playgroud)

如果你安装了mercurial,你可以做同样的事情.

这是雪豹.但我认为它也应该起作用.


Cha*_*ffy 22

正如其他人所说,distutils.sysconfig有相关设置:

import distutils.sysconfig
print distutils.sysconfig.get_python_lib()
Run Code Online (Sandbox Code Playgroud)

...虽然默认情况下site.py做了一些更粗略的事情,但下面会解释:

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

(如果常量不同,它也会添加${sys.prefix}/lib/site-python和添加两个路径sys.exec_prefix).

那就是说,背景是什么?你不应该site-packages直接搞乱你; setuptools/distutils将用于安装,并且您的程序可能在virtualenv中运行,其中您的pythonpath完全是用户本地的,因此它不应该直接使用系统站点包.

  • 在 osx 和 ubuntu 上使用 `python2` 工作可靠,无论是否使用 virtualenv,但根本不使用 `python3`。 (3认同)
  • 2008年还有一段时间 - 这个答案是在Python 3.0发布之前的三个月. (2认同)

fna*_*ank 19

在基于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()
Run Code Online (Sandbox Code Playgroud)

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

在/ usr/local/bin目录/

或者可以简单地编写以下命令来列出python包所在的所有路径.

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

注意:位置可能会因您的操作系统而异,例如在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']
Run Code Online (Sandbox Code Playgroud)


che*_*ter 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
Run Code Online (Sandbox Code Playgroud)

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

  • 需要外部库`easy_install`并且如果不可用则不会优雅地失败,这是不够的:) (4认同)

小智 12

附注:distutils.sysconfig.get_python_lib()当存在多个site-packages目录时(根据本文的建议),建议的解决方案()不起作用.它只返回主要的site-packages目录.

唉,我也没有更好的解决方案.Python似乎没有跟踪site-packages目录,只跟踪它们中的包.

  • @Piotr这可能是distutils.sysconfig中的一个错误.我刚刚测试了它,我得到了内部网站包,正如预期的那样. (3认同)

小智 11

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

import sys; 
print [f for f in sys.path if f.endswith('packages')]
Run Code Online (Sandbox Code Playgroud)

输出(Ubuntu安装):

['/home/username/.local/lib/python2.7/site-packages',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages']
Run Code Online (Sandbox Code Playgroud)

  • 接受的答案是推荐的方式,所以你应该告诉你为什么你的更好,因为它有点像黑客 (2认同)

wim*_*wim 10

现代的stdlib方法是使用sysconfig模块,该模块在2.7和3.2+版本中可用。

sysconfig)不与混淆distutils.sysconfig子模块(在其他几个答案这里提到)。后者是一个完全不同的模块,缺少get_paths下面讨论的功能。

Python当前使用八个路径(docs):

  • stdlib:包含非平台特定标准Python库文件的目录。
  • platstdlib:包含特定于平台的标准Python库文件的目录。
  • platlib:特定于站点,特定于平台的文件的目录。
  • purelib:特定于站点的,非特定于平台的文件的目录。
  • include:非平台特定头文件的目录。
  • platinclude:特定于平台的头文件的目录。
  • scripts:脚本文件的目录。
  • data:数据文件目录。

在大多数情况下,发现此问题的用户会对“ purelib”路径感兴趣(在某些情况下,您可能也对“ platlib”感兴趣)。与当前接受的答案不同,无论您是否激活了virtualenv,该方法仍然有效。

在系统级别(在Mac OS上为Python 3.7.0):

>>> import sysconfig
>>> sysconfig.get_paths()['purelib']
'/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages'
Run Code Online (Sandbox Code Playgroud)

有了静脉,你会得到这样的东西

>>> import sysconfig
>>> sysconfig.get_paths()['purelib']
'/private/tmp/.venv/lib/python3.7/site-packages'
Run Code Online (Sandbox Code Playgroud)

还可以使用Shell脚本来显示这些详细信息,您可以通过将其sysconfig作为模块执行来调用这些详细信息:

python -m sysconfig
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这个答案有一个致命的缺陷:“sysconfig”模块不会在 Debian/Ubuntu 及其衍生版本上生成正确的路径,而“distutils.sysconfig”模块却可以。 (3认同)

Arm*_*her 9

get_python_lib已经提到的函数的另一个注释:在某些平台上,不同的目录用于特定于平台的模块(例如:需要编译的模块).如果您传递plat_specific=True给该函数,您将获得特定于平台的软件包的站点包.


Pyr*_*bie 9

这应该适用于虚拟环境中的所有分布,因为它具有"低技术"性质.os模块总是驻留在'site-packages'的父目录中

import os; print(os.path.dirname(os.__file__) + '/site-packages')
Run Code Online (Sandbox Code Playgroud)

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

alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
Run Code Online (Sandbox Code Playgroud)


Flo*_*sch 8

from distutils.sysconfig import get_python_lib
print get_python_lib()
Run Code Online (Sandbox Code Playgroud)


Sou*_*nis 8

点子显示将提供有关软件包的所有详细信息:https : //pip.pypa.io/en/stable/reference/pip_show/ [点子显示] [1]

获取位置:

pip show <package_name>| grep Location
Run Code Online (Sandbox Code Playgroud)


小智 6

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

蟒蛇 2

pip show six | grep "Location:" | cut -d " " -f2
Run Code Online (Sandbox Code Playgroud)

蟒蛇3

pip3 show six | grep "Location:" | cut -d " " -f2
Run Code Online (Sandbox Code Playgroud)


Sah*_*wal 5

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

pip install ipython
ipython 
import imaplib
imaplib?
Run Code Online (Sandbox Code Playgroud)

这将给出有关 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
Run Code Online (Sandbox Code Playgroud)