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

时间:2008-09-23 17:04:44

标签: python installation

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

23 个答案:

答案 0 :(得分:633)

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

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

答案 1 :(得分:305)

来自"How to Install Django" documentation(虽然这不仅仅是Django安装有用) - 从shell执行以下命令:

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

为便于阅读而设置格式(而不是用作单行),如下所示:

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

答案 2 :(得分:301)

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

  1. 全局网站包(“dist-packages”)目录在您运行时列在sys.path中:

    python -m site
    

    要获得更简洁的列表,请从Python代码中的site module运行getsitepackages

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

    注意:使用virtualenvs getsitepackages is not available,上面的sys.path会正确列出virtualenv的site-packages目录。

  2. 每个用户 site-packages目录(PEP 370)是Python安装本地软件包的地方:

    python -m site --user-site
    

    如果这指向不存在的目录,请检查Python的退出状态,并参阅python -m site --help以获取解释。

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

  3. 实用技巧

    • <package>.__path__可让您识别特定包裹的位置:(details

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

      $ 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
      

答案 3 :(得分:98)

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

答案 4 :(得分:65)

这对我有用:

python -m site --user-site

答案 5 :(得分:23)

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

这是针对雪豹。但我认为它也应该起作用。

答案 6 :(得分:21)

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

答案 7 :(得分:16)

可以在以下位置找到在基于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']

答案 8 :(得分:13)

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

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默认使用的did完全相同,所以在easy_install工作的所有地方(因此,无处不在,甚至是mac)都可能是正确的。玩得开心。注意:原始代码中有许多脏话。

答案 9 :(得分:11)

附注:当存在多个site-packages目录(recommended by this article)时,建议的解决方案(distutils.sysconfig.get_python_lib())不起作用。它只会返回主站点包目录。

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

答案 10 :(得分:10)

这对我有用。 它将为您提供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']

答案 11 :(得分:8)

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

答案 12 :(得分:8)

由于它具有“低技术”性质,因此应该适用于虚拟环境内外的所有发行版。 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'

答案 13 :(得分:7)

from distutils.sysconfig import get_python_lib
print get_python_lib()

答案 14 :(得分:5)

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

要获取位置:

pip show <package_name>| grep Location

答案 15 :(得分:4)

现代的stdlib方法是使用sysconfig模块,该模块在2.7和3.2+版本中可用。 Python当前使用八个路径(docs):

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

在大多数情况下,发现此问题的用户会对'purelib'路径感兴趣(在some cases中,您可能也对'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

注意: sysconfigsource)不应与distutils.sysconfig子模块(source )在其他几个答案中提到。那是一个完全不同的模块,并且缺少上面讨论的get_paths函数。

答案 16 :(得分:2)

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

答案 17 :(得分:1)

对于使用poetry的用户,您可以使用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/

答案 18 :(得分:1)

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

import site


def get_site_packages_dir():
        return [p for p  in site.getsitepackages()
                if "site-packages" in p][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 'site-package' in p][0])"

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages


答案 19 :(得分:0)

我必须为我正在处理的项目做一些稍微不同的事情:找到相对于基本安装前缀的 relative 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

之类的内容

答案 20 :(得分:0)

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

Python 2

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

Python 3

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

答案 21 :(得分:0)

如果您安装了两个版本的Python,则我认为这是有用的未提及的事情,例如在3.8和3.5上,您的计算机上可能有两个名为site-packages的文件夹。在这种情况下,您可以使用以下命令指定python版本:

py -3.5 -c "import site; print(site.getsitepackages()[1])

答案 22 :(得分:-1)

如果已将其添加到PYTHONPATH中,您也可以执行类似的操作

import sys
print('\n'.join(sys.path))