我如何找到我的站点包目录的位置?
当前回答
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
(或者只是site.getsitepackages()[0]的第一项)
其他回答
现代的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将用于安装位置的。
对于那些正在使用诗歌的人,你可以通过诗歌调试找到你的虚拟环境路径:
$ 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/
在基于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']
对于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,那么将第一个代码框复制粘贴到终端中可能是安全的。
所有的答案(或者:重复同样的答案)都是不充分的。你要做的是:
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)。玩得开心。注意:原始代码中有很多脏话。
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用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中获得所有直接子目录