Answers:
网站包目录有两种类型,全局目录和每个用户目录。
运行时会列出全局站点软件包(“ dist-packages ”)目录sys.path
:
python -m site
要在Python代码中getsitepackages
从站点模块运行更简洁的列表,请执行以下操作:
python -c 'import site; print(site.getsitepackages())'
注意:使用virtualenvs时,getsitepackages不可用,但是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
为您提供每个用户站点软件包的所有已安装列表。
<package>.__path__
可让您识别特定包装的位置:(详细信息)
$ python -c "import setuptools as _; print(_.__path__)"
['/usr/lib/python2.7/dist-packages/setuptools']
<module>.__file__
让您识别特定模块的位置:(差异)
$ python3 -c "import os as _; print(_.__file__)"
/usr/lib/python3.6/os.py
运行pip show <package>
以显示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
python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
(在Python 2和3上都可以使用)在virtualenv内部/外部获取站点特定模块的目录。
python -c "import site; print(site.getsitepackages()[0])"
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
(或仅带的第一项site.getsitepackages()[0]
)
hasattr(sys,'real_prefix')
然后从确定网站的包启发式[p for p in sys.path if p.endswith('site-packages')][-1]
(加上检查是否有做之前一个发现[-1]
。
解决方案:
...是单线的:
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安装有用)
cdsitepackages
)直接更改为环境的site-packages目录。
/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/...
)。您只能/usr/local
通过via 获得东西,除非决定自己制作发行版,否则sudo pip
不能sudo pip
在Ubuntu上使用:如果使用sudo pip
,则有责任确保通过或安装的当前和将来 python模块的所有依赖项都兼容。考虑创建什么问题来解决sudo apt
sudo pip
virtualenv
dist-packages
(L)Ubuntu中2的区别。
这对我有用:
python -m site --user-site
~/.local/lib/python2.7/site-packages
)。
virtualenv
它抱怨该包装不存在。如何调用在自定义位置安装的软件包?
假设您已经安装了“ 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
在有和没有virtualenv的情况下,在osx和ubuntu上都可以可靠地工作,而根本没有python3
。
python3
。
现代的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
platlib
,例如/usr/local/lib/python3.6/site-packages
?传统上,应在本地安装东西/usr/local
。
在基于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。
所有答案(或:一遍又一遍重复的相同答案)都不够。您要做的是:
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默认使用的目录完全相同,因此在easy_install工作的所有地方(所以,甚至是macs),它都可能是正确的。玩得开心。注意:原始代码中包含许多脏话。
easy_install
,并且如果不可用则不会正常失败:)
旁注:distutils.sysconfig.get_python_lib()
如果存在多个site-packages目录(如本文推荐),则建议的解决方案()不起作用。它只会返回主site-packages目录。
,我也没有更好的解决方案。Python似乎不跟踪站点软件包目录,而只是跟踪其中的软件包。
get_python_lib()
从virtualenv内部运行时会显示用于创建virtualenv的Python 站点包,而不是virtualenv的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']
get_python_lib
已经提到的功能的附加说明:在某些平台上,不同的目录用于平台特定的模块(例如:需要编译的模块)。如果传递plat_specific=True
给该函数,则将获得针对特定平台的软件包的站点软件包。
from distutils.sysconfig import get_python_lib
print get_python_lib()
点子显示将提供有关软件包的所有详细信息:https : //pip.pypa.io/en/stable/reference/pip_show/ [点子显示] [1]
获取位置:
pip show <package_name>| grep Location
回答老问题。但是为此使用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目录。如果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
。
pip show <package name>