如何找到site-packages目录的位置?
>>> import site; site.getsitepackages() ['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
(或只是第一项site.getsitepackages()[0]
)
有两种类型的站点包目录,全局和每用户.
运行时会列出全局站点包(" dist-packages ")目录sys.path
:
python -m site
有关getsitepackages
从Python代码中的站点模块运行的更简洁的列表:
python -c "import site; print(site.getsitepackages())"
注意:使用virtualenvs时,getitepackages不可用,sys.path
但从上面可以正确列出virtualenv的site-packages目录.
在每个用户站点包目录(PEP 370)是其中的Python安装本地套餐:
python -m site --user-site
如果这指向不存在的目录,请检查Python的退出状态并查看python -m site --help
说明.
提示:运行pip list --user
或pip freeze --user
为您提供所有已安装的每个用户站点包的列表.
让您识别特定包裹的位置:( 详情)
$ python -c "import setuptools as _; print(_.__path__)" ['/usr/lib/python2.7/dist-packages/setuptools']
让您识别特定模块的位置:( 差异)
$ python3 -c "import os as _; print(_.__file__)" /usr/lib/python3.6/os.py
运行pip show
以显示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
从"如何安装Django"文档(虽然这不仅仅是Django安装有用) - 从shell执行以下命令:
python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
格式化为可读性(而不是用作单行),如下所示:
from distutils.sysconfig import get_python_lib print(get_python_lib())
对于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,您可能会安全地将第一个代码框复制粘贴到终端中.
这对我有用:
python -m site --user-site
假设你已经安装了'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,你可以做同样的事情.
这是雪豹.但我认为它也应该起作用.
正如其他人所说,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完全是用户本地的,因此它不应该直接使用系统站点包.
在基于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']
所有答案(或:反复重复的相同答案)都是不充分的.你想要做的是:
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或其他dists,但因为它与easy_install默认使用的did完全相同,所以在easy_install工作的所有地方(因此,无处不在,甚至是mac)都可能是正确的.玩得开心.注意:原始代码中有许多脏话.
附注:distutils.sysconfig.get_python_lib()
当存在多个site-packages目录时(根据本文的建议),建议的解决方案()不起作用.它只返回主要的site-packages目录.
唉,我也没有更好的解决方案.Python似乎没有跟踪site-packages目录,只跟踪它们中的包.
这适合我.它将为您提供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']
现代的stdlib方法是使用sysconfig
模块,该模块在2.7和3.2+版本中可用。
注:sysconfig
(源)不与混淆distutils.sysconfig
子模块(源在其他几个答案这里提到)。后者是一个完全不同的模块,缺少get_paths
下面讨论的功能。
Python当前使用八个路径(docs):
stdlib:包含非平台特定标准Python库文件的目录。
platstdlib:包含特定于平台的标准Python库文件的目录。
platlib:特定于站点,特定于平台的文件的目录。
purelib:特定于站点的,非特定于平台的文件的目录。
include:非平台特定头文件的目录。
platinclude:特定于平台的头文件的目录。
scripts:脚本文件的目录。
data:数据文件目录。
在大多数情况下,发现此问题的用户会对“ purelib”路径感兴趣(在某些情况下,您可能也对“ platlib”感兴趣)。与当前接受的答案不同,无论您是否激活了virtualenv,该方法仍然有效。
在系统级别(在Mac OS上为Python 3.7.0):
>>> import sysconfig >>> sysconfig.get_paths()['purelib'] '/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages'
有了静脉,你会得到这样的东西
>>> import sysconfig >>> sysconfig.get_paths()['purelib'] '/private/tmp/.venv/lib/python3.7/site-packages'
还可以使用Shell脚本来显示这些详细信息,您可以通过将其sysconfig
作为模块执行来调用这些详细信息:
python -m sysconfig
get_python_lib
已经提到的函数的另一个注释:在某些平台上,不同的目录用于特定于平台的模块(例如:需要编译的模块).如果您传递plat_specific=True
给该函数,您将获得特定于平台的软件包的站点包.
这应该适用于虚拟环境中的所有分布,因为它具有"低技术"性质.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'
from distutils.sysconfig import get_python_lib print get_python_lib()
点子显示将提供有关软件包的所有详细信息:https : //pip.pypa.io/en/stable/reference/pip_show/ [点子显示] [1]
获取位置:
pip show| grep Location