ChatGPT解决这个技术问题 Extra ChatGPT

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

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

如果您只想要一个包裹的确切位置,那么您可以使用 pip show <package name>

P
Peterino

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

运行时,全局站点包(“dist-packages”)目录在 sys.path 中列出: python -m site 要获得更简洁的列表,请从 Python 代码中的站点模块运行 getsitepackages: python -c 'import site; print(site.getsitepackages())' 注意:在虚拟环境中,getsitepackages 不适用于旧版本的 virtualenv,但上面的 sys.path 将正确列出 virtualenv 的 site-packages 目录。在 Python 3 中,您可以改用 sysconfig 模块: python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])' 每个用户的站点包目录 (PEP 370) 是 Python 安装本地包的位置: python -m site --user-site 如果这指向一个不存在的包目录检查 Python 的退出状态并查看 python -m site --help 以获得解释。提示:运行 pip list --user 或 pip freeze --user 会为您提供每个用户安装的所有站点包的列表。

实用技巧

.__path__ 可让您识别特定包的位置:(详细信息) $ python -c "import setuptools as _; print(_.__path__)" ['/usr/lib/python2.7/dist -packages/setuptools']

.__file__ 可让您识别特定模块的位置:(差异) $ python3 -c "import os as _; print(_.__file__)" /usr/lib/python3.6/os.py

运行 pip show 以显示 Debian 样式的包信息: $ pip show pytest 名称:pytest 版本:3.8.2 摘要:pytest:使用 Python 进行简单强大的测试 主页:https://docs.pytest.org/en /latest/ 作者:Holger Krekel、Bruno Oliveira、Ronny Pfannschmidt、Floris Bruynooghe、Brianna Laugher、Florian Bruhin 等作者电子邮件:无许可证:MIT 许可证位置:/home/peter/.local/lib/python3.4/site -packages 需要:more-itertools、atomicwrites、setuptools、attrs、pathlib2、6、py、pluggy


virtualenv 中有一个站点包目录。您可以使用 python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())" 获取 virtualenv 内部/外部特定于站点的模块的目录(它也适用于 Python 2 和 3)。
好的。并获得第一个:python -c "import site; print(site.getsitepackages()[0])"
这应该在任何有关使用 python 的基础教程中。我已经使用 python 多年了,不知道站点模块。本来可以省去这么多头疼的...
我建议更改 Python 的官方教程。有关详细信息,请参阅 PR #16974,感谢 @salotz 的建议!
我认为 stackoverflow.com/a/52638888/1365918 很容易成为这个问题的最佳答案。
M
MERose
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

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


这很好,但不幸的是,此功能仅适用于 python2.7。因此,如果您使用的是 python2.7 或更高版本,但不适用于 python 2.6 及以下版本,那么,这是一个很好的解决方案
python -c“导入站点;打印(site.getsitepackages())”
我得到 AttributeError: 'module' object has no attribute 'getsitepackages' 与 virtualenv (python 2.7.8) 一起使用时,下面的 distutils 解决方案虽然有效。
@radtek:对于 venv,我通过 hasattr(sys,'real_prefix') 检测到 venv,然后从 [p for p in sys.path if p.endswith('site-packages')][-1] 启发式地确定站点包(加上在执行 [-1] 之前检查是否找到了一个。
@radtek 站点模块不适用于 virtualenv github.com/pypa/virtualenv/issues/355,这是一个已知错误
G
Greg Dubicki

一个解决方案:

在 virtualenv 之外 - 提供全局站点包的路径,

insidue a 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())

来源: "How to Install Django" documentation 的一个非常旧的版本(尽管这不仅仅对 Django 安装有用)


virtualenv 是否提供了一种查找其站点包的方法?
您可以使用具有命令 cdsitepackages 的 virtualenvwrapper 直接切换到环境的站点包目录。
@PiotrDobrogost:在 Linux 上的 virtualenv 中的 Python 2.7 上为我工作
第一条评论不再适用:这显示了 virtualenv 外部和内部的正确位置。
在使用 Linux bash 的 Windows 10 上对我不起作用,它返回 /usr/lib/python3/dist-packages 而不是 /usr/lib/python3.5/dist-packages
D
David Hollander

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


如果询问者在特定包裹的位置之后,module.__file__ 是更好的方法。如果他们试图安装东西……只需使用这些工具。
'/usr/lib/pythonX.X/dist-packages' in site.getsitepackages() 在 Ubuntu 上(尽管它在列表中 /usr/local/... 之后)。您只能通过 sudo pip 将某些东西放入 /usr/local,除非您决定制作自己的发行版,否则不应在 Ubuntu 上使用 sudo pip:如果您使用 sudo pip,则您有责任确保通过 sudo aptsudo pip 安装的当前和 未来 python 模块是兼容的。考虑what problem virtualenv was created to solve
python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()",我得到 ModuleNotFoundError: No module named 'requests_unixsocket'
s
sth

这对我有用:

python -m site --user-site

对我来说,这指向一个甚至不存在的文件夹 (~/.local/lib/python2.7/site-packages)。
同样,在 OS X Mavericks 中,我的家 .local 不是我想要它找到的,而且它不是真的在那里。
它在我的主 /Library 文件夹中,我不得不手动导航到它,由于某种原因,直接完整路径不起作用
我如何使用这里安装的软件包?如果我这样做virtualenv,它会抱怨该包不存在。如何调用安装在自定义位置的软件包?
这告诉你 Python 将在哪里寻找用户特定的包。在这种情况下,诸如“甚至不存在”和“不是我想要它找到的东西”之类的评论没有意义。
w
wim

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

注意:不要将 sysconfig (source) 与此处其他几个答案中提到的 distutils.sysconfig 子模块 (source) 混淆。后者是一个完全不同的模块,它缺少下面讨论的 get_paths 函数。此外,distutilsdeprecated in 3.10,很快将不可用。

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

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

在大多数情况下,发现此问题的用户会对“purelib”路径感兴趣(在 some cases 中,您可能也对“platlib”感兴趣)。 purelib 路径是通过 pip 等工具安装普通 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

# Windows
C:\> py -c "import sysconfig; print(sysconfig.get_path('purelib'))"
C:\Users\wim\AppData\Local\Programs\Python\Python38\Lib\site-packages

使用 venv,你会得到这样的东西

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

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

# Windows
C:\Users\wim\AppData\Local\Temp\.venv\Lib\site-packages

函数 sysconfig.get_paths() 返回所有相关安装路径的字典,例如在 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'}

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

python -m sysconfig

附录:Debian / Ubuntu 怎么样?

正如一些评论者指出的那样,Debian 系统(以及 Ubuntu,作为衍生系统)的 sysconfig 结果并不准确。根据 Debian policies on Python packaging,当用户 pip 安装软件包时,它将进入 dist-packages 而不是 site-packages

差异的根本原因是因为 Debian patch the distutils install layout 正确地反映了他们对站点的更改,但他们未能修补 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+ 制定新计划。可能,他们将不得不 start patching sysconfig as well,因为这是 pip 将用于安装位置的内容。


这是一个很好的答案,我很高兴新的 sysconfig 模块使这更容易。有没有办法获取本地前缀 platlib,例如 /usr/local/lib/python3.6/site-packages?传统上,本地安装的东西应该放在 /usr/local 中。
这个问题的最佳答案很容易!谢谢你。我发现唯一缺少的是在遇到导入语句时检查这些位置的顺序。此外,在加载 python 时,这些位置中的任何一个是否已预先搜索/缓存?知道这对 IMO 也很有用。
不幸的是,这个答案有一个致命的缺陷:sysconfig 模块不会在 Debian/Ubuntu 和衍生产品上生成正确的路径,而 distutils.sysconfig 模块可以。
@Alleo 在调查了此发行版的情况后,在答案中添加了附录。真是一罐蠕虫。这是一个很长的 list of stuff Debian messed up in Python
C
CharlesB

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

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


>>> import pg >>> print pg.__path__ Traceback(最近一次调用最后):文件“”,第 1 行,在 中 AttributeError:'module'对象没有属性'path'
它有效,我需要找到 sklearn 包以添加到 PYDEV 路径,谢谢。
为此使用 django.__file__ 而不是 __path__。而且,不,这并不能保证这与站点包有任何关系,但对于 django 之类的东西,您很可能 pip 已安装,当您处于快点,它也可以用于其他目的(例如从文件系统读取默认配置文件)。
根据此答案和其他答案,您可以在命令行的一行中执行此操作,以获取 foo.bar 包的路径:python -c "import foo.bar as _; print(_.__path__[0])"
C
Charles Duffy

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


在 osx 和 ubuntu 上使用和不使用 virtualenv 时使用 python2 可靠,但在使用 python3 时完全不可靠。
2008 年已经过去了——这个答案是 Python 3.0 发布前三个月。
当然,但今天我的评论可能会有所帮助。如果我错了,请纠正我。此外,关于python3,我没有否决这个答案或任何其他答案。
f
fnatic_shank

在基于 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 及其衍生产品。
@SamuelSantana 你是对的。 dist-packages 特定于基于 debian 的系统。在这种情况下,我从系统安装中调用了 site.getsitepackages(),因此是 dist-packages,其他安装将显示 site-packages。
S
Sourabh Potnis

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

要获取位置:

pip show <package_name>| grep Location

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

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

将 OS X 的“cut”命令添加到末尾也会给你字符串:pip3 show foo | grep Location | cut -d ' ' -f 2
对于 Windows,当 必须 被使用时,使用 findstr 而不是 grep。因此,python -m pip show numpy | findstr "Location" 给出 Location: c:\users\bballdave025\appdata\local\programs\python\python38\lib\site-packages。您使用 pip 安装的模块在 site packages 中。您可以很确定 site-packagespip 本身的位置 - 正如 python -m pip ... 所调用的那样。因此,python -m pip show pip | findstr "Location" 显示了与我们从 numpy 获得的 site-packages 相同的路径。除了 pip,您几乎总是可以尝试 virtualenv (venv) & setuptools,对于 NIX *或 Win
c
cheater

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

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


谢谢,这非常有用,在带有方括号的 py3 上打印它让我 /usr/local/lib/python3.4/dist-packages 我正在尝试弄清楚如何获取 /usr/lib/python3.4/dist -packages 所以将不得不进一步发挥。
需要外部库 easy_install,如果不可用,则不会正常失败:)
确实,这并不完美,但它对我有用并且花了很多时间来弄清楚,所以我把它放在这里,希望其他人可以在我已经花费的时间的基础上再接再厉。
K
Kristian Glass

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

接受的答案是推荐的方法,所以你应该说明为什么你的更好,因为它有点像黑客
黑客有什么问题? ;) 如果您以交互方式工作,它会更简单、更容易理解和记住。
Q
Qubei

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

我喜欢你的低技术方法。这是一个独立于平台的版本: import os; print(os.path.join(os.path.dirname(os.__file__), 'site-packages'))
我的原始代码也是平台无关的。 Windows 接受正斜杠 ('/') 和反斜杠 (``) 作为路径分隔符。在 Windows 上使用反斜杠更为常见。
V
Vladimir Vagaytsev

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

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


我猜这就是为什么 get_python_lib() 在 virtualenv 中运行时显示用于创建 virtualenv 的 Python site-packages 而不是 virtualenv 的 site-packages 的原因。
@Piotr 这可能是 distutils.sysconfig 中的一个错误。正如预期的那样,我刚刚对其进行了测试,并获得了内部站点包。
还使用安装在 Linux 上的 virtualenv 中的 Python 2.7 进行了测试,并且 distutils.sysconfig 方法可以很好地获取内部 Python 的站点包。
A
Armin Ronacher

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


F
Florian Bösch
from distutils.sysconfig import get_python_lib
print get_python_lib()

佚名

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

蟒蛇2

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

蟒蛇 3

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

S
Sahil Agarwal

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

这不是 site-packages 目录,而是安装包的目录。这也仅在您使用 iPython 而不能以编程方式获取安装目录时才有用。
c
cglacet

对于使用 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/

A
Angel

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

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



这不适用于例如。 Ubuntu,其中 site-packages 目录被命名为 dist-packages... 一点也不可靠。
@rdb 刚刚编辑了答案(不知道它是 Ubunut 上的 dist-packages,现在它包括 dist-packages
M
MultipleMonomials

对于我正在处理的项目,我必须做一些稍微不同的事情:找到相对于基本安装前缀的 relative 站点包目录。如果 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 的内容。


S
Stamatis Tiniakos

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

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