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

2024-12-03 08:45:00
admin
原创
151
摘要:问题描述:如何找到我的site-packages目录的位置?解决方案 1:站点包目录有两种类型:全局目录和每个用户目录。运行时会列出全局站点包 (" dist-packages ") 目录:sys.path python -m site 要获得更简洁的列表,请getsitepackages从Python 代码...

问题描述:

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


解决方案 1:

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

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

 python -m site

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

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

注意:在虚拟环境中, getsitepackages 在旧版本的中不可用,但上面的命令将正确列出虚拟环境的 site-packages 目录。在 Python 3 中,您可以改用sysconfig 模块:virtualenv`sys.path`

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

 python -m site --user-site

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

提示:运行pip list --user或为您提供每个用户站点pip 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

解决方案 2:

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

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

解决方案 3:

解决方案:

  • 虚拟环境之外 - 提供全局站点包的路径,

  • 在虚拟环境中 - 提供虚拟环境的站点包

...这是一行代码:

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

解决方案 4:

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

解决方案 5:

这对我有用:

python -m site --user-site

解决方案 6:

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

注意:不要将sysconfig( sourcedistutils.sysconfig ) 与此处其他几个答案中提到的子模块 ( source ) 混淆。后者是一个完全不同的模块,它缺少get_paths下面讨论的功能。此外,在 Python 3.10 中distutils已弃用,并在 Python 3.12 中被删除。

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

  • stdlib:包含非平台特定标准 Python 库文件的目录。

  • platstdlib:包含特定于平台的标准 Python 库文件的目录。

  • platlib:站点特定、平台特定文件的目录。

  • purelib:站点特定、非平台特定文件的目录。

  • include:非平台特定头文件的目录。

  • platinclude:平台特定的头文件的目录。

  • scripts:脚本文件的目录。

  • 数据:数据文件目录。

在大多数情况下,发现这个问题的用户会对“purelib”路径感兴趣(在某些情况下,您可能也会对“platlib”感兴趣)。purelib 路径是使用 等工具安装普通 Python 包的位置pip

在系统级别,你会看到类似这样的内容:

# Linux
$ python3 -c "import sysconfig; print(sysconfig.get_path('purelib'))"
/usr/local/lib/python3./site-packages

# Linux (Ubuntu/Debian based)
$ python3 -c "import sysconfig; print(sysconfig.get_path('purelib'))"
/usr/local/lib/python3.12/dist-packages    

# macOS (official python.org installer)
$ python3 -c "import sysconfig; print(sysconfig.get_path('purelib'))"
/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages

# macOS (brew installed python@3.12)
$ python3 -c "import sysconfig; print(sysconfig.get_path('purelib'))"
/usr/local/lib/python3.12/site-packages

# Windows
C:> py -c "import sysconfig; print(sysconfig.get_path('purelib'))"
C:UserswimAppDataLocalProgramsPythonPython312Libsite-packages

使用 venv,你会得到类似这样的结果

# Linux
/tmp/.venv/lib/python3.12/site-packages

# macOS
/private/tmp/.venv/lib/python3.12/site-packages

# Windows
C:UserswimAppDataLocalTemp.venvLibsite-packages

该函数sysconfig.get_paths()返回所有相关安装路径的字典,例如在 Linux 上:

>>> import sysconfig
>>> sysconfig.get_paths()
{'stdlib': '/usr/local/lib/python3.12',
 'platstdlib': '/usr/local/lib/python3.12',
 'purelib': '/usr/local/lib/python3.12/site-packages',
 'platlib': '/usr/local/lib/python3.12/site-packages',
 'include': '/usr/local/include/python3.12',
 'platinclude': '/usr/local/include/python3.12',
 'scripts': '/usr/local/bin',
 'data': '/usr/local'}

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

python -m sysconfig

附录:Debian/Ubuntu 怎么样?

注意:以前,基于 Debian 的发行版返回的安装路径不准确sysconfig,但现在这些发行版的路径已正确报告。我将保留此部分以了解错误的历史背景,但请注意,Debian / Ubuntu 的最新版本似乎已经解决了该问题。

正如一些评论者指出的那样,Debian 系统(以及其衍生系统 Ubuntu)的 sysconfig 结果并不准确。当用户 pip 安装软件包时,它将进入dist-packages而不是site-packages,这符合Debian 的 Python 打包政策。

造成这种差异的根本原因是 Debian修补了 distutils 安装布局,以正确反映他们对网站的更改,但却未能修补 sysconfig 模块。

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

root@cb5e85f17c7f:/# python3 -m sysconfig | grep packages
    platlib = "/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 将用于安装位置的内容。

解决方案 7:

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

这是针对 Snow Leopard 的。但我认为它应该也适用于一般情况。

解决方案 8:

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

解决方案 9:

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

获取位置:

pip show <package_name>| grep Location

在 Linux 中,您可以通过以下方式进入 site-packages 文件夹:

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

解决方案 10:

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

解决方案 11:

所有答案(或:重复相同的答案)都不够充分。您需要做的是:

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

解决方案 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']

解决方案 13:

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

解决方案 14:

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

解决方案 15:

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

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

解决方案 16:

from distutils.sysconfig import get_python_lib
print get_python_lib()

解决方案 17:

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

Python 2

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

Python 3

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

解决方案 18:

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

解决方案 19:

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

与 cheater 的答案类似,我的解决方案深入 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:

对于那些使用诗歌的人,你可以使用以下命令找到你的虚拟环境路径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/

解决方案 21:

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

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


解决方案 22:

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

py -3.5 -c "import site; print(site.getsitepackages()[1])
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用