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
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
18 回答
这应该适用于虚拟环境中的所有分布,因为它具有“低技术”性质 . os模块总是驻留在'site-packages'的父目录中
要将dir更改为site-packages目录,我使用以下别名(在* nix系统上):
这对我有用 . 它将为您提供dist-packages和site-packages文件夹 . 如果文件夹不在Python的路径上,那么无论如何它都不会对你有好处 .
输出(Ubuntu安装):
正如其他人所说,
distutils.sysconfig
具有相关设置:...虽然默认
site.py
做了一些更粗糙的事情,但在下面解释:(它还添加
${sys.prefix}/lib/site-python
并为sys.exec_prefix
添加两个路径,如果常量不同的话) .那就是说,
site-packages
直接搞乱了你的site-packages
; setuptools / distutils将用于安装,并且您的程序可能在virtualenv中运行,其中您的pythonpath完全是用户本地的,因此它不应该直接使用系统站点包 .附注:当存在多个site-packages目录(如recommended by this article)时,建议的解决方案(
distutils.sysconfig.get_python_lib()
)不起作用 . 它只返回主要的site-packages目录 .唉,我也没有更好的解决方案 . Python似乎没有跟踪site-packages目录,只跟踪它们中的包 .
现代stdlib方式使用sysconfig模块,可在2.7和3.2版本中使用 . Python目前使用八个路径(docs):
在大多数情况下,发现此问题的用户会对'purelib'路径感兴趣(在some cases中,您可能也对'platlib'感兴趣) . 与目前接受的答案不同,这种方法不应该是错误的,这取决于你是否激活了virtualenv .
在系统级(这是mac OS上的Python 3.7.0):
有了一个venv,你会得到这样的东西
shell脚本也可用于显示这些详细信息,您可以通过执行
sysconfig
作为模块来调用:Note:
sysconfig
(source)不要与此处其他几个答案中提到的distutils.sysconfig
子模块(source)混淆 . 这是一个完全不同的模块,它缺少上面讨论的get_paths
功能 .所有答案(或:反复重复的相同答案)都不充分 . 你想要做的是:
最后一行显示安装目录 . 适用于Ubuntu,而上述则不适用 . 不要问我关于windows或其他dists的问题,但是因为它与easy_install默认使用的dir完全相同,所以在easy_install工作的地方(因此,无处不在,甚至是mac)都可能是正确的 . 玩得开心 . 注意:原始代码中有许多脏话 .
这对我有用:
回答旧问题 . 但是为此使用ipython .
这将给出关于imaplib包的以下输出 -
(或只是
site.getsitepackages()[0]
的第一项)如果它已经添加到
PYTHONPATH
,您也可以执行类似的操作假设你已经安装了'django'软件包 . 导入它并输入dir(django) . 它将向您展示该模块的所有功能和属性 . 输入python解释器 -
如果你安装了mercurial,你可以做同样的事情 .
这是雪豹 . 但我认为它也应该起作用 .
对于Ubuntu,
...是不正确的 .
它会指向你
/usr/lib/pythonX.X/dist-packages
此文件夹仅包含操作系统自动安装的程序包以供程序运行 .
在ubuntu上,包含通过setup_tools \ easy_install \ pip安装的软件包的site-packages文件夹将在
/usr/local/lib/pythonX.X/dist-packages
中如果用例与安装或读取源代码相关,则第二个文件夹可能更有用 .
如果您不使用Ubuntu,您可能会安全地将第一个代码框复制粘贴到终端中 .
对于我正在处理的项目,我必须做一些稍微不同的事情:找到相对于基本安装前缀的相对site-packages目录 . 如果site-packages文件夹在
/usr/lib/python2.7/site-packages
中,我想要/lib/python2.7/site-packages
部分 . 事实上,我遇到了site-packages
所在的系统/usr/lib64
,并且接受的答案不适用于这些系统 .与骗子的答案类似,我的解决方案深入探讨了Distutils的内脏,找到实际在
setup.py
内传递的路径 . 想弄清楚我不想让任何人再次想到这一点,真是太痛苦了 .这应该打印像
/Lib/site-packages
或/lib/python3.6/site-packages
.已经提到的
get_python_lib
函数的另一个注释:在某些平台上,不同的目录用于特定于平台的模块(例如:需要编译的模块) . 如果将plat_specific=True
传递给该函数,则会获得特定于平台的软件包的站点软件包 .从"How to Install Django" documentation(虽然这不仅仅是Django安装有用) - 从shell执行以下命令:
格式化为可读性(而不是用作单行),如下所示:
有两种类型的站点包目录,全局和每用户 .
运行时,
sys.path
中列出有关更简洁的列表,请从Python代码中的site module运行
getsitepackages
:注意:使用virtualenvs getsitepackages is not available,上面的
sys.path
将正确列出virtualenv的site-packages目录 .如果这指向不存在的目录,请检查Python的退出状态,并参阅
python -m site --help
以获取解释 .提示:运行
pip list --user
或pip freeze --user
会为您提供所有已安装的每个用户站点包的列表 .在基于Debian的系统中安装python安装的本机系统包可以在以下位置找到:
在OSX中 -
/Library/Python/2.7/site-packages
通过使用这个小代码:
但是,可以在以下位置找到通过
pip
安装的软件包列表:或者可以简单地编写以下命令来列出python包所在的所有路径 .
注意:位置可能会因您的操作系统而异,例如在OSX中