我怎么找到我的网站-包的目录?

有帮助吗?

解决方案

有两种类型网站-包的目录, 全球每个用户.

  1. 全球 网站-包("dist-包")的目录中列出的 sys.path 当你运行:

    python -m site
    

    一个更简明清单运行 getsitepackages网站的模块 在代码:

    python -c "import site; print(site.getsitepackages())"
    

    注: 与virtualenvs getsitepackages是不是可以, sys.path 从上述清单的虚拟环境的网站-包装目录正确,虽然。

  2. 每个用户 网站-包装目录(PEP370)是蟒蛇安装当地的软件包:

    python -m site --user-site
    

    如果这一点不存目录检查出口状况的蟒蛇看看 python -m site --help 对解释。

    提示: 运行 pip list --userpip freeze --user 给你一个列表中的所有安装的 每个用户 网站的软件包。


实用技巧

  • <package>.__path__ 让你可以识别的位置(s)的特殊包装:(详细信息)

    $ 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
    

其他提示

>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

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

来自 <!> quot ;如何安装Django <!> quot;文档(虽然这不仅仅对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默认使用的dir完全相同,所以在easy_install工作的地方(因此,无处不在,甚至是mac)都可能是正确的。玩得开心。注意:原始代码中有许多脏话。

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

唉,我也没有更好的解决方案。 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']

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

这应该适用于虚拟环境内外的所有发行版,因为它是<!>“low-tech <!>”;性质。 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()

一个现代化的标准库的方法是使用 sysconfig 模块,可用2.7版和3.2+.蟒蛇目前使用 八个 路径(文档):

  • 标准库:目录中包含的标准蟒蛇图书馆的文件,不平台特有的。
  • platstdlib:目录中包含的标准蟒蛇图书馆的文件平台的具体。
  • platlib:目录的网站的特定平台的具体文件。
  • purelib:目录用于针对具体地点的,非特定平台的文件。
  • 包括:目录用于非特定平台头文件。
  • platinclude:目录用于特定平台头文件。
  • 脚本:目录用于脚本文件。
  • 数据:目录数据文件。

在大多数情况下,用户寻找这一问题有兴趣的'purelib'路径(在 某些情况下, 你可能会感兴趣'platlib'太)。不同于目前公认的答案,这个方法应该不是胡作非为这取决于你是否有一个虚拟环境激活。

在系统一级(这是蟒蛇3.7.0在mac OS):

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

一个脚本还提供显示这些信息,你可以援引通过执行 sysconfig 作为一个模块:

python -m sysconfig

注: sysconfig (来源)是不能混为一谈的 distutils.sysconfig 模块(来源)中提到的几个其他的答案在这里。这是一个完全不同的模块,它的缺乏 get_paths 功能上所讨论的。

pip show将提供有关包的所有详细信息: https://pip.pypa.io/en/stable/reference/pip_show/ [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

对于我正在处理的项目,我必须做一些稍微不同的事情:找到相对于基本安装前缀的 relative 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的安装位置

Python 2

pip show six | grep "Location:" | cut -d " " -f2

Python 3

pip3 show six | grep "Location:" | cut -d " " -f2

如果它已添加到PYTHONPATH,您也可以执行类似

的操作
import sys
print('\n'.join(sys.path))
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top