我如何找到我的站点包目录的位置?
解决方案:
在virtualenv之外-提供全局站点包的路径, 在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())
来源:一个非常旧的“如何安装Django”文档(尽管这不仅仅对安装Django有用)
正如其他人所注意到的,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. exe。Prefix}/lib/site-python,为sys. python添加两个路径。Exec_prefix也是,如果常量不同的话)。
也就是说,背景是什么?你不应该直接破坏你的站点包;Setuptools /distutils将用于安装,并且您的程序可能运行在一个virtualenv中,其中您的pythonpath完全是用户本地的,因此它也不应该假设直接使用系统站点包。
前面提到的get_python_lib函数的另一个注意事项是:在某些平台上,不同的目录用于特定于平台的模块(例如:需要编译的模块)。如果将plat_specific=True传递给函数,则可以获得平台特定包的站点包。
附注:建议的解决方案(distutils.sysconfig.get_python_lib())在存在多个site-packages目录(本文推荐)时不起作用。它将只返回主site-packages目录。
唉,我也没有更好的解决办法。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安装的软件包的site-packages文件夹将位于/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_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)。玩得开心。注意:原始代码中有很多脏话。
这对我很有用。 它将为您提供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']
>>> 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_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']
这应该适用于虚拟环境内外的所有发行版,因为它是“低技术”性质。os模块总是位于'site-packages'的父目录中
import os; print(os.path.dirname(os.__file__) + '/site-packages')
要将dir更改为site-packages dir,我使用以下别名(在*nix系统上):
alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
老问题的答案。但是使用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
有两种类型的站点包目录,全局的和每个用户的。
全局站点包(“dist-packages”)目录列在sys. exe目录下。运行时的路径: Python -m site 要获得更简洁的列表,请在Python代码中的site模块中运行getsitepackages: Python -c '导入站点;打印(site.getsitepackages ()) 注意:在虚拟环境中,旧版本的virtualenv、sys. exe不能使用getsiteppackages。上面的Path会正确地列出virtualenv的site-packages目录。在Python 3中,你可以使用sysconfig模块: Python3 -c 'import sysconfig;打印(sysconfig.get_paths () [" purelib "])” 每个用户站点-packages目录(PEP 370)是Python安装本地包的地方: Python -m site——user-site 如果指向一个不存在的目录,检查Python的退出状态,并查看Python -m site——help了解解释。 提示:运行pip list——user或pip freeze——user会给出每个用户安装的所有站点包的列表。
实用技巧
> <包。__path__让你识别特定包的位置:(详细信息) 导入setuptools as _;打印(_.__path__)” (“/ usr / lib / python2.7 / dist-packages / setuptools”) > <模块。__file__让你识别特定模块的位置:(区别) $ python3 -c "import OS as _;打印(_.__file__)” /usr/lib/python3.6/os.py 执行pip show <package>命令显示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 laughher, Florian Bruhin等 Author-email:没有 许可证:MIT许可证 地点:/home/peter/.local/lib/python3.4/site-packages 需要:更多itertools, atomicwrites, setuptools, attrs, pathlib2, six, py, plug - ggy
对于我正在从事的一个项目,我必须做一些稍微不同的事情:找到相对于基本安装前缀的相对site-packages目录。如果site-packages文件夹在/usr/lib/python2.7/site-packages中,我想要/lib/python2.7/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之类的东西。
现代的stdlib方法是使用sysconfig模块,在2.7和3.2+版本中可用。与目前公认的答案不同,无论您是否激活了虚拟环境,此方法都仍然有效。
注意:不要将sysconfig (source)与distutils混淆。Sysconfig子模块(源)在这里的其他几个答案中提到。后者是一个完全不同的模块,它缺少下面讨论的get_paths函数。此外,distutils在3.10中已弃用,很快就不可用了。
Python目前使用八个路径(docs):
stdlib:包含非特定于平台的标准Python库文件的目录。 platstdlib:包含特定于平台的标准Python库文件的目录。 Platlib:特定于站点、特定于平台的文件的目录。 Purelib:特定于站点的、非平台特定的文件的目录。 包含:用于非平台特定头文件的目录。 Platinclude:平台特定头文件的目录。 Scripts:脚本文件目录。 Data:数据文件目录。
在大多数情况下,发现这个问题的用户可能对“purelib”路径感兴趣(在某些情况下,您可能对“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结果并不准确。当用户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将用于安装位置的。
PIP展会将提供有关包装的所有细节: 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])")
您应该尝试这个命令来确定pip的安装位置
Python 2
pip show six | grep "Location:" | cut -d " " -f2
Python 3
pip3 show six | grep "Location:" | cut -d " " -f2
之前没有提到的一些东西,我认为是有用的,如果你安装了两个版本的Python,比如3.8和3.5,在你的机器上可能有两个名为site-packages的文件夹。在这种情况下,您可以使用以下命令指定python版本:
py -3.5 -c "import site; print(site.getsitepackages()[1])
对于那些正在使用诗歌的人,你可以通过诗歌调试找到你的虚拟环境路径:
$ 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
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用pip3安装包时,“Python中的ssl模块不可用”
- 无法切换Python与pyenv
- Python if not == vs if !=
- 如何从scikit-learn决策树中提取决策规则?
- 为什么在Mac OS X v10.9 (Mavericks)的终端中apt-get功能不起作用?
- 将旋转的xtick标签与各自的xtick对齐
- 为什么元组可以包含可变项?
- 如何合并字典的字典?
- 如何创建类属性?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 解析日期字符串并更改格式
- 使用try和。Python中的if
- 如何在Python中获得所有直接子目录