首页 文章

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

提问于
浏览
720

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

18 回答

  • 7

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

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

    正如其他人所说, 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 直接搞乱了你的 site-packages ; setuptools / distutils将用于安装,并且您的程序可能在virtualenv中运行,其中您的pythonpath完全是用户本地的,因此它不应该直接使用系统站点包 .

  • 11

    附注:当存在多个site-packages目录(如recommended by this article)时,建议的解决方案( distutils.sysconfig.get_python_lib() )不起作用 . 它只返回主要的site-packages目录 .

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

  • 15

    现代stdlib方式使用sysconfig模块,可在2.7和3.2版本中使用 . Python目前使用八个路径(docs):

    stdlib:包含非特定于平台的标准Python库文件的目录 . platstdlib:包含特定于平台的标准Python库文件的目录 . platlib:特定于站点的平台特定文件的目录 . purelib:特定于站点的非平台特定文件的目录 . include:非平台特定头文件的目录 . platinclude:特定于平台的头文件的目录 . scripts:脚本文件的目录 . data:数据文件的目录 .

    在大多数情况下,发现此问题的用户会对'purelib'路径感兴趣(在some cases中,您可能也对'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
    

    Note: sysconfigsource)不要与此处其他几个答案中提到的 distutils.sysconfig 子模块(source)混淆 . 这是一个完全不同的模块,它缺少上面讨论的 get_paths 功能 .

  • 22

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

    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)都可能是正确的 . 玩得开心 . 注意:原始代码中有许多脏话 .

  • 21

    这对我有用:

    python -m site --user-site
    
  • 299

    回答旧问题 . 但是为此使用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
    
  • 619
    >>> import site; site.getsitepackages()
    ['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
    

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

  • 13

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

    import sys
    print('\n'.join(sys.path))
    
  • 7

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

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

  • 63
    from distutils.sysconfig import get_python_lib
    print get_python_lib()
    
  • 97

    对于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,您可能会安全地将第一个代码框复制粘贴到终端中 .

  • 2

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

  • 2

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

  • 0

    "How to Install Django" documentation(虽然这不仅仅是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())
    
  • 0

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

    运行时, sys.path 中列出

    python -m site
    

    有关更简洁的列表,请从Python代码中的site module运行 getsitepackages

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

    注意:使用virtualenvs getsitepackages is not available,上面的 sys.path 将正确列出virtualenv的site-packages目录 .

    • per user site-packages目录(PEP 370)是Python安装本地软件包的地方:
    python -m site --user-site
    

    如果这指向不存在的目录,请检查Python的退出状态,并参阅 python -m site --help 以获取解释 .

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

  • 9

    在基于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']
    

相关问题