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


Answers:


528

网站包目录有两种类型,全局目录和每个用户目录。

  1. 运行时会列出全局站点软件包(“ dist-packages ”)目录sys.path

    python -m site

    要在Python代码中getsitepackages站点模块运行更简洁的列表,请执行以下操作:

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

    注意:使用virtualenvs时,getsitepackages不可用,但是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
    

17
在virtualenv中有一个站点包目录。您可以使用python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"(在Python 2和3上都可以使用)在virtualenv内部/外部获取站点特定模块的目录。
jfs

4
真好 并获得第一个:python -c "import site; print(site.getsitepackages()[0])"
Brent Faust

2
这应该在使用python的任何基础教程中。我已经使用python多年了,对站点模块一无所知。
本来可以省去

1
我建议对Python的官方教程进行更改。有关详细信息,请参见PR#16974,并感谢@salotz的建议!
Peterino '19

1
我认为stackoverflow.com/a/52638888/1365918无疑是此问题的最佳答案。
kapad

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

(或仅带的第一项site.getsitepackages()[0]


17
很好,但是不幸的是,此功能仅在python2.7中可用。因此,如果您使用的是python2.7或更高版本,但不适用于python 2.6或更低版本,则是一个不错的解决方案
Dan Niero 2013年

15
python -c“导入站点;打印(site.getsitepackages())”
Lars Schneider

29
我得到AttributeError:与virtualenv(python 2.7.8)一起使用时,“模块”对象没有属性“ getsitepackages”,但是下面的distutils解决方案可以工作。
radtek

8
@radtek:为VENV的,我通过检测VENV hasattr(sys,'real_prefix')然后从确定网站的包启发式[p for p in sys.path if p.endswith('site-packages')][-1](加上检查是否有做之前一个发现[-1]
eudoxos

4
@radtek这是一个已知的错误,该站点模块不适用于virtualenv github.com/pypa/virtualenv/issues/355
Guillem Cucurull,

319

解决方案:

  • 在virtualenv外部-提供全局站点程序包的路径,
  • 包含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安装有用)


1
virtualenv是否提供查找其站点包的方法?
Daryl Spitzer

10
您可以使用virtualenvwrapper(具有命令cdsitepackages)直接更改为环境的site-packages目录。
john2x 2012年

6
@PiotrDobrogost:在Linux上的virtualenv中在Python 2.7上为我工作
RichVel 2013年

2
第一条评论不再适用:这显示了virtualenv内部和外部的正确位置。
astrojuanlu

2
在使用Linux bash的Windows 10上对我不起作用,它返回/usr/lib/python3/dist-packages而不是/usr/lib/python3.5/dist-packages
Delgan'9

99

对于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__则是更好的方法。如果他们正在尝试安装东西,请使用工具。
东武2012年

'/usr/lib/pythonX.X/dist-packages' in site.getsitepackages()在Ubuntu上运行(尽管在列表中排在后面 /usr/local/...)。您只能/usr/local通过via 获得东西,除非决定自己制作发行版,否则sudo pip不能sudo pip在Ubuntu上使用:如果使用sudo pip,则有责任确保通过或安装的当前和将来 python模块的所有依赖项都兼容。考虑创建什么问题来解决sudo aptsudo pipvirtualenv
jfs

清楚的解释以了解dist-packages(L)Ubuntu中2的区别。
Timo

69

这对我有用:

python -m site --user-site

15
对我来说,它指向的文件夹甚至不存在(~/.local/lib/python2.7/site-packages)。
尼尔·特拉夫特

1
同样,在OS X Mavericks中,我的家.local不是我想要它找到的东西,是的。
radtek

它在我的主/ Library文件夹中,我不得不手动导航到该文件夹​​,由于某种原因,直接完整路径无法正常工作
efwjames

我如何使用此处安装的软件包?如果我这样做,virtualenv它抱怨该包装不存在。如何调用在自定义位置安装的软件包?
AbtPst '16

2
这告诉您Python将在哪里寻找用户特定的软件包。在这种情况下,“甚至根本不存在”和“不是我想要它找到的”这样的注释没有意义。
诚实的安倍晋三

28

假设您已经安装了“ 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,则可以执行相同的操作。

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


>>>进口PG >>>打印PG .__ path__回溯(最近最后调用):文件“<标准输入>”,第1行,在<模块> AttributeError的:“模块”对象没有属性“ 路径
Dannid

它的工作原理,我需要找到sklearn包添加到PYDEV路径,谢谢。
berkay 2015年

使用django.__file__这个,而不是__path__。而且,不,这不能保证它与站点程序包有关,但是与django之类的东西一样,您最有可能安装了pip,当您急忙时可以使用它,并且可以用于其他目的(例如,从文件系统读取默认配置文件)。
JL Peyret

根据此答案和其他答案,您可以从命令行在一行中完成此操作,以获取foo.bar软件包的路径:python -c "import foo.bar as _; print(_.__path__[0])"
snark

23

如其他人所述,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完全是用户本地的,因此也不应假定直接使用系统站点包。


3
python2在有和没有virtualenv的情况下,在osx和ubuntu上都可以可靠地工作,而根本没有python3
2016年

2
2008年已经过去了-这个答案距离Python 3.0发行三个月了。
查尔斯·达菲

当然可以,但是今天我的评论可能会有所帮助。如果错了,请纠正我。此外,我没有对这个答案或任何其他关于的投票予以否决python3
2016年

22

现代的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'

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

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

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

python -m sysconfig

这是一个很好的答案,我很高兴新的sysconfig模块使此操作变得容易。有没有办法获取本地前缀platlib,例如/usr/local/lib/python3.6/site-packages?传统上,应在本地安装东西/usr/local
eudoxos

轻松获得此问题的最佳答案!谢谢。我发现唯一缺少的是遇到导入语句时检查这些位置的顺序。另外,加载python时是否预先搜索/缓存了这些位置?知道这也将对海事组织有用。
kapad

21

在基于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']

如果我没记错的话,dist-packages特定于Debian及其衍生版本。
塞缪尔

1
@SamuelSantana你是正确的。dist软件包特定于基于debian的系统。在这种情况下,我site.getsitepackages()从系统安装中调用了dist-packages,其他安装将显示site-packages。
fnatic_shank '18

15

所有答案(或:一遍又一遍重复的相同答案)都不够。您要做的是:

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或其他dists的问题,但是由于它与easy_install默认使用的目录完全相同,因此在easy_install工作的所有地方(所以,甚至是macs),它都可能是正确的。玩得开心。注意:原始代码中包含许多脏话。


1
谢谢,这是非常有用的,在带有打印括号的py3上,它可以使我获得/usr/local/lib/python3.4/dist-packages的信息,我正在尝试找出如何获得/usr/lib/python3.4/dist的信息-packages,因此必须发挥更大作用。
斯图尔特·阿克森

4
需要外部库easy_install,并且如果不可用则不会正常失败:)
抖动

1
确实,这不是完美的,但是它对我有用,并且花了很多时间弄清楚,所以我把它放在这里,希望其他人可以在我已经花在它上面的时间上建立。
作弊者

13

旁注:distutils.sysconfig.get_python_lib()如果存在多个site-packages目录(如本文推荐),则建议的解决方案()不起作用。它只会返回主site-packages目录。

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


1
我猜这就是为什么get_python_lib()从virtualenv内部运行时会显示用于创建virtualenv的Python 站点包,而不是virtualenv的site-packages的原因
Piotr Dobrogost

3
@Piotr这可能是distutils.sysconfig中的错误。我刚刚对其进行了测试,并且得到了预期的内部站点包。
东武2012年

还使用Linux上的virtualenv中安装的Python 2.7进行了测试,并且distutils.sysconfig方法可以很好地获取内部Python的站点包。
RichVel

12

这对我有用。这将使您同时获得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']

2
推荐的答案是推荐的方式,所以您应该告诉自己为什么更好,因为这有点技巧
CharlesB 2012年

骇客怎么了?;)如果您是交互式工作,它更容易理解和记住。
just_an_old_guy 2012年

11

由于它具有“低技术”性质,因此该方法适用于虚拟环境内外的所有发行版。os模块始终位于“ site-packages”的父目录中

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

要将目录更改为站点程序包目录,我使用以下别名(在* nix系统上):

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

10

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




3

回答老问题。但是为此使用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

1
这不是site-packages目录,而是软件包安装到的目录。这也仅在使用iPython而不是能够以编程方式获取安装目录时有用。
danielunderwood '16

3

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

Python 2

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

Python 3

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

1

我必须为正在处理的项目做些不同的事情:找到相对于基本安装前缀的相对 site-packages目录。如果site-packages文件夹位于中/usr/lib/python2.7/site-packages,则需要该/lib/python2.7/site-packages部件。我有,事实上,遇到在那里系统site-packages/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-packages或的内容/lib/python3.6/site-packages


-2

如果已将其添加到中,则PYTHONPATH还可以执行类似操作

import sys
print('\n'.join(sys.path))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.