安装 - 如何找到Python site-packages目录的位置?

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

18个解决方案

618 votes

>>> import site; site.getsitepackages()

['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

(或只是site.getsitepackages()[0]的第一项)

eudoxos answered 2018-12-27T03:42:25Z

298 votes

从“如何安装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())

Daryl Spitzer answered 2018-12-27T03:42:53Z

202 votes

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

运行时,全局站点包(“dist-packages”)目录列在pip list --user中:

pip list --user

有关更简洁的列表,请从Python代码中的站点模块运行pip list --user:

pip list --user

注意:由于virtualenvs的getitepackages不可用,但上面的pip list --user将正确列出virtualenv的site-packages目录。

每个用户的站点包目录(PEP 370)是Python安装本地包的地方:

pip list --user

如果这指向不存在的目录,请检查Python的退出状态,并参阅pip list --user以获取解释。

提示:运行pip list --user或pip freeze --user会为您提供所有已安装的每个用户站点包的列表。

Peterino answered 2018-12-27T03:42:03Z

97 votes

对于Ubuntu,

python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"

...是不正确的。

它会指向/usr/local/lib/pythonX.X/dist-packages

此文件夹仅包含操作系统自动安装的程序包以供程序运行。

在ubuntu上,包含通过setup_tools \ easy_install \ pip安装的软件包的site-packages文件夹将在/usr/local/lib/pythonX.X/dist-packages

如果用例与安装或读取源代码相关,则第二个文件夹可能更有用。

如果您不使用Ubuntu,您可能会安全地将第一个代码框复制粘贴到终端中。

David Hollander answered 2018-12-27T03:43:52Z

63 votes

这对我有用:

python -m site --user-site

Ramashri answered 2018-12-27T03:44:13Z

22 votes

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

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

Sumod answered 2018-12-27T03:44:47Z

21 votes

正如其他人所说,site-packages具有相关设置:

import distutils.sysconfig

print distutils.sysconfig.get_python_lib()

...虽然默认的site-packages做了一些更粗糙的事情,在下面解释:

import sys, os

print os.sep.join([sys.prefix, 'lib', 'python' + sys.version[:3], 'site-packages'])

(它还添加了site-packages并为sys.exec_prefix添加了两个路径,如果常量不同的话)。

那就是说,背景是什么? 你不应该直接搞乱你的site-packages; setuptools / distutils将用于安装,并且您的程序可能在virtualenv中运行,其中您的pythonpath完全是用户本地的,因此它不应该直接使用系统站点包。

Charles Duffy answered 2018-12-27T03:45:28Z

15 votes

在基于Debian的系统中安装python安装的本机系统包可以在以下位置找到:

/usr/lib/python2.7/dist-packages/

在OSX中 - pip

通过使用这个小代码:

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']

fnatic_shank answered 2018-12-27T03:46:33Z

13 votes

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

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默认使用的dir完全相同,所以在easy_install工作的地方(因此,无处不在,甚至是mac)都可能是正确的。 玩得开心。 注意:原始代码中有许多脏话。

cheater answered 2018-12-27T03:47:01Z

11 votes

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

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

Vladimir Vagaytsev answered 2018-12-27T03:47:29Z

9 votes

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

just_an_old_guy answered 2018-12-27T03:47:57Z

8 votes

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

Armin Ronacher answered 2018-12-27T03:48:19Z

7 votes

from distutils.sysconfig import get_python_lib

print get_python_lib()

Florian Bösch answered 2018-12-27T03:48:35Z

7 votes

这应该适用于虚拟环境中的所有分布,因为它具有“低技术”性质。 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'

Pyramid Newbie answered 2018-12-27T03:49:03Z

2 votes

回答旧问题。 但是为此使用ipython。

pip install ipython

ipython

import imaplib

imaplib?

这将给出关于imaplib包的以下输出 -

Type: module

String form:

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

Sahil Agarwal answered 2018-12-27T03:49:32Z

2 votes

现代stdlib方式使用sysconfig模块,可在2.7和3.2+版本中使用。 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'

有了一个venv,你会得到这样的东西

>>> import sysconfig

>>> sysconfig.get_paths()['purelib']

'/private/tmp/.venv/lib/python3.7/site-packages'

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

python -m sysconfig

注意:sysconfig(源代码)不要与这里的其他几个答案中提到的distutils.sysconfig子模块(源)相混淆。 这是一个完全不同的模块,它缺少上面讨论的get_paths功能。

wim answered 2018-12-27T03:51:18Z

0 votes

对于我正在处理的项目,我必须做一些稍微不同的事情:找到相对于基本安装前缀的相对site-packages目录。 如果site-packages文件夹在/Lib/site-packages中,我想要/lib/python3.6/site-packages部分。 事实上,我遇到site-packages在/usr/lib64中的系统,并且接受的答案对这些系统不起作用。

与骗子的答案类似,我的解决方案深入探究了Distutils的内涵,找到了实际在/Lib/site-packages内部传递的路径。想到我不希望任何人再次想到这一点,真是太痛苦了。。

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。

MultipleMonomials answered 2018-12-27T03:51:53Z

0 votes

如果已经添加到PYTHONPATH,您也可以执行类似的操作

import sys

print('\n'.join(sys.path))

filtfilt answered 2018-12-27T03:52:15Z

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐