如何找到我的站点包目录的位置?
pip show <package name>
有两种类型的站点包目录,全局和每个用户。
运行时,全局站点包(“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 会为您提供每个用户安装的所有站点包的列表。
实用技巧
运行 pip show
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
(或者只是第一个带有 site.getsitepackages()[0]
的项目)
hasattr(sys,'real_prefix')
检测到 venv,然后从 [p for p in sys.path if p.endswith('site-packages')][-1]
启发式地确定站点包(加上在执行 [-1]
之前检查是否找到了一个。
一个解决方案:
在 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 安装有用)
cdsitepackages
的 virtualenvwrapper 直接切换到环境的站点包目录。
/usr/lib/python3/dist-packages
而不是 /usr/lib/python3.5/dist-packages
。
对于 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 apt
或 sudo 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'
这对我有用:
python -m site --user-site
~/.local/lib/python2.7/site-packages
)。
virtualenv
,它会抱怨该包不存在。如何调用安装在自定义位置的软件包?
现代标准库方法是使用 sysconfig
模块,在 2.7 和 3.2+ 版本中可用。 与当前接受的答案不同,无论您是否有虚拟环境处于活动状态,此方法仍然有效。
注意:不要将 sysconfig
(source) 与此处其他几个答案中提到的 distutils.sysconfig
子模块 (source) 混淆。后者是一个完全不同的模块,它缺少下面讨论的 get_paths
函数。此外,distutils
是 deprecated 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 将用于安装位置的内容。
platlib
,例如 /usr/local/lib/python3.6/site-packages
?传统上,本地安装的东西应该放在 /usr/local
中。
sysconfig
模块不会在 Debian/Ubuntu 和衍生产品上生成正确的路径,而 distutils.sysconfig
模块可以。
假设您已经安装了包“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,你可以做同样的事情。
这是给雪豹的。但我认为它通常也应该起作用。
django.__file__
而不是 __path__
。而且,不,这并不能保证这与站点包有任何关系,但对于 django 之类的东西,您很可能 pip 已安装,当您处于快点,它也可以用于其他目的(例如从文件系统读取默认配置文件)。
foo.bar
包的路径:python -c "import foo.bar as _; print(_.__path__[0])"
正如其他人所指出的,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 完全是用户本地的,因此它也不应该直接使用系统站点包。
python2
可靠,但在使用 python3
时完全不可靠。
python3
,我没有否决这个答案或任何其他答案。
在基于 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']
site.getsitepackages()
,因此是 dist-packages,其他安装将显示 site-packages。
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])")
pip3 show foo | grep Location | cut -d ' ' -f 2
cut
是 GNU coreutil gnu.org/software/coreutils/manual/html_node/…
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-packages
是 pip
本身的位置 - 正如 python -m pip ...
所调用的那样。因此,python -m pip show pip | findstr "Location"
显示了与我们从 numpy
获得的 site-packages
相同的路径。除了 pip
,您几乎总是可以尝试 virtualenv
(venv
) & setuptools
,对于 NIX *或 Win
所有答案(或:一遍又一遍地重复相同的答案)都是不充分的。你想要做的是:
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)。玩得开心。注意:原始代码中有很多脏话。
easy_install
,如果不可用,则不会正常失败:)
这对我有用。它将为您提供 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']
由于其“低技术”性质,这应该适用于进出虚拟环境的所有发行版。 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'
附注:当有多个站点包目录(如 recommended by this article)时,建议的解决方案 (distutils.sysconfig.get_python_lib()
) 不起作用。它只会返回主站点包目录。
唉,我也没有更好的解决方案。 Python 似乎不跟踪站点包目录,只跟踪其中的包。
get_python_lib()
在 virtualenv 中运行时显示用于创建 virtualenv 的 Python site-packages 而不是 virtualenv 的 site-packages 的原因。
对已经提到的 get_python_lib
函数的附加说明:在某些平台上,不同的目录用于特定于平台的模块(例如:需要编译的模块)。如果将 plat_specific=True
传递给函数,您将获得平台特定包的站点包。
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
回答老问题。但是为此使用 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
对于使用 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/
我做了一个非常简单的函数来完成工作
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
dist-packages
... 一点也不可靠。
dist-packages
,现在它包括 dist-packages
对于我正在处理的项目,我必须做一些稍微不同的事情:找到相对于基本安装前缀的 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
的内容。
一些我认为有用的没有提到的东西,如果你安装了两个版本的 Python,例如 3.8 和 3.5,你的机器上可能有两个名为 site-packages 的文件夹。在这种情况下,您可以使用以下命令指定 python 版本:
py -3.5 -c "import site; print(site.getsitepackages()[1])
不定期副业成功案例分享
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])"