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

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

1407402 次浏览

一种解决方案:

  • 在虚拟环境之外-提供全球站点包的路径,
  • 在虚拟环境中-提供Virtualenv的站点包

…是这样一句话:

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

格式为易读性(而不是用作一行),如下所示:

from distutils.sysconfig import get_python_libprint(get_python_lib())


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

from distutils.sysconfig import get_python_libprint get_python_lib()

正如其他人所指出的,distutils.sysconfig具有相关设置:

import distutils.sysconfigprint distutils.sysconfig.get_python_lib()

…尽管默认的site.py做了一些更粗糙的事情,如下所述:

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

(如果常量不同,它还会添加${sys.prefix}/lib/site-python并添加sys.exec_prefix的两条路径)。

也就是说,上下文是什么?你不应该直接搞乱你的site-packages;setupols/distutils将用于安装,你的程序可能在一个虚拟环境中运行,你的pythonpath完全是用户本地的,所以它也不应该假设直接使用系统站点包。

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

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

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

对于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安装的软件包的站点包文件夹将位于/usr/local/lib/pythonX.X/dist-packages

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

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

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

这是为雪豹设计的。但我认为它应该也能正常工作。

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

from setuptools.command.easy_install import easy_installclass easy_install_default(easy_install):""" class easy_install had problems with the fist parameter not beingan instance of Distribution, even though it was. This is due tosome import-related mess."""
def __init__(self):from distutils.dist import Distributiondist = Distribution()self.distribution = distself.initialize_options()self._dry_run = Noneself.verbose = dist.verboseself.force = Noneself.help = 0self.finalized = 0
e = easy_install_default()import distutils.errorstry:e.finalize_options()except distutils.errors.DistutilsError:pass
print e.install_dir

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

这对我有用。它将为您提供dist包和site包文件夹。如果文件夹不在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']

这是什么为我工作:

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

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

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

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

在OSX-/Library/Python/2.7/site-packages

通过使用这个小代码:

from distutils.sysconfig import get_python_libprint 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']

由于其“低技术”性质,这应该适用于虚拟环境内外的所有发行版。os模块始终驻留在“站点包”的父目录中

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

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

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

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

pip install ipythonipythonimport imaplibimaplib?

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

Type:        moduleString form: <module 'imaplib' from '/usr/lib/python2.7/imaplib.py'>File:        /usr/lib/python2.7/imaplib.pyDocstring:IMAP4 client.
Based on RFC 2060.
Public class:           IMAP4Public variable:        DebugPublic functions:       Internaldate2tupleInt2APParseFlagsTime2Internaldate

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

  1. 当您运行时,全球站点包(“dist组件”)目录在sys.path中列出:

     python -m site

    要获得更简洁的列表,请从Python代码中的站点模块运行getsitepackages

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

    警告:但是,在getsitepackages不可用旧版本#0的虚拟环境中,上面的sys.path将正确列出虚拟环境的站点包目录。在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 pytestName: pytestVersion: 3.8.2Summary: pytest: simple powerful testing with PythonHome-page: https://docs.pytest.org/en/latest/Author: Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, Floris Bruynooghe, Brianna Laugher, Florian Bruhin and othersAuthor-email: NoneLicense: MIT licenseLocation: /home/peter/.local/lib/python3.4/site-packagesRequires: more-itertools, atomicwrites, setuptools, attrs, pathlib2, six, py, pluggy

对于我正在进行的项目,我必须做一些稍微不同的事情:找到相对于基本安装前缀的相对 site-包目录。如果site-包文件夹在/usr/lib/python2.7/site-packages中,我想要/lib/python2.7/site-packages部分。事实上,我遇到过site-packages/usr/lib64中的系统,而公认的答案在这些系统上不起作用。

与作弊者的回答类似,我的解决方案深入到了干扰者的内部,找到实际上在setup.py内部传递的路径。弄清楚这一点是如此痛苦,以至于我不希望任何人再次弄清楚这一点。

import sysimport osfrom 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的内容。

一种现代的stdlib方式是使用#0模块,在版本2.7和3.2+中可用。与当前接受的答案不同,无论您是否有活动的虚拟环境,此方法仍然有效。

说明sysconfig来源)不要与这里其他几个答案中提到的distutils.sysconfig子模块(来源)混淆。后者是一个完全不同的模块,它缺乏下面讨论的get_paths功能。此外,distutils已于3.10弃用,很快就不可用了。

Python当前使用路径(文档):

  • stdlib:包含非特定于平台的标准Python库文件的目录。
  • platstdlib:包含特定于平台的标准Python库文件的目录。
  • platlib:特定于站点、特定于平台的文件的目录。
  • 纯属:特定于站点、非特定于平台的文件的目录。
  • 包括:非平台特定头文件的目录。
  • 平台:特定于平台的头文件的目录。
  • 脚本:脚本文件的目录。
  • 数据:数据文件的目录。

在大多数情况下,发现此问题的用户会对“purelb”路径感兴趣(在一些案件中,您可能也对“platlib”感兴趣)。purelb路径是#0等工具安装普通Python包的地方。

在系统级别,你会看到这样的东西:

# 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
# WindowsC:\> 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
# WindowsC:\Users\wim\AppData\Local\Temp\.venv\Lib\site-packages

函数#0返回所有相关安装路径的字典,例如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'}

外壳脚本也可用于显示这些详细信息,您可以通过将sysconfig作为模块执行来调用它:

python -m sysconfig

增编:Debian/Ubuntu怎么样?

正如一些评论者指出的那样,Debian系统(以及作为派生的Ubuntu)的sysconfig结果不准确。当用户pip安装一个包时,它将进入dist组件而不是站点包,如Debian关于Python打包的政策所示。

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

例如,在Ubuntu 20.04.4 LTS(焦点Fossa)上:

root@cb5e85f17c7f:/# python3 -m sysconfig | grep packagesplatlib = "/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安装有点被黑客攻击,当distutils完全不可用时,他们需要为3.12+制定一个新的计划。可能,他们将不得不也开始修补sysconfig,因为这是pip将用于安装位置的。

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

要获取位置:

pip show <package_name>| grep Location

在Linux中,您可以通过以下方式转到site-包文件夹:

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

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

python2

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

python3

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

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

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

对于那些使用诗歌的人,您可以使用poetry debug找到您的虚拟环境路径:

$ poetry debug
PoetryVersion: 1.1.4Python:  3.8.2
VirtualenvPython:         3.8.2Implementation: CPythonPath:           /Users/cglacet/.pyenv/versions/3.8.2/envs/my-virtualenvValid:          True
SystemPlatform: darwinOS:       posixPython:   /Users/cglacet/.pyenv/versions/3.8.2

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

ls /Users/cglacet/.pyenv/versions/3.8.2/envs/my-virtualenv/lib/python3.8/site-packages/

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

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