【问题标题】:How do I find the location of my Python site-packages directory?如何找到我的 Python 站点包目录的位置?
【发布时间】:2010-09-12 10:44:36
【问题描述】:

如何找到我的站点包目录的位置?

【问题讨论】:

  • 如果你只想要一个包的确切位置,那么你可以使用pip show <package name>

标签: python installation


【解决方案1】:

一个解决方案:

  • virtualenv 之外 - 提供 global 站点包的路径,
  • 在 virtualenv 中 - 提供 virtualenv 的 站点包

...这是单线:

python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"

为了可读性而格式化(而不是用作单行),如下所示:

from distutils.sysconfig import get_python_lib
print(get_python_lib())


来源:"How to Install Django" documentation 的一个非常旧的版本(尽管这不仅仅对 Django 安装有用)

【讨论】:

  • virtualenv 是否提供查找其站点包的方法?
  • 可以使用virtualenvwrapper,命令cdsitepackages,直接切换到环境的site-packages目录。
  • @PiotrDobrogost:在 Linux 上的 virtualenv 中的 Python 2.7 上为我工作
  • 第一条评论不再适用:这显示了virtualenv内外的正确位置。
  • 在使用 Linux bash 的 Windows 10 上对我不起作用,它返回 /usr/lib/python3/dist-packages 而不是 /usr/lib/python3.5/dist-packages
【解决方案2】:
from distutils.sysconfig import get_python_lib
print get_python_lib()

【讨论】:

    【解决方案3】:

    正如其他人所指出的,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 完全是用户本地的,因此它也不应该假定直接使用系统站点包。

    【讨论】:

    • 在 osx 和 ubuntu 上使用 python2 可靠,无论是否使用 virtualenv,但根本不使用 python3
    • 2008 年过去了——这个答案是 Python 3.0 发布前三个月。
    • 当然,但今天我的评论可能会有所帮助。如果我错了,请纠正我。此外,对于python3,我没有否决这个答案或任何其他答案。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      附注:当有多个站点包目录(如recommended by this article)时,建议的解决方案(distutils.sysconfig.get_python_lib())不起作用。它只会返回主站点包目录。

      唉,我也没有更好的解决方案。 Python 似乎不跟踪站点包目录,只跟踪其中的包。

      【讨论】:

      • 我想这就是为什么get_python_lib() 在 vi​​rtualenv 中运行时显示 Python 的 site-packages 用于创建 virtualenv 而不是 virtualenv 的 site-packages 的原因.
      • @Piotr 这可能是 distutils.sysconfig 中的错误。正如预期的那样,我刚刚对其进行了测试,并获得了内部站点包。
      • 还使用安装在 Linux 上的 virtualenv 中的 Python 2.7 进行了测试,并且 distutils.sysconfig 方法可以很好地获取内部 Python 的站点包。
      【解决方案6】:

      对于 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/... 之后)。您只能通过sudo pip 将某些内容导入/usr/local,除非您决定制作自己的发行版,否则您不应在Ubuntu 上使用sudo pip:如果您使用sudo pip,则您有责任确保通过sudo aptsudo pip 安装的当前和未来 python 模块是兼容的。考虑what problem virtualenv was created to solve
      • python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()",我得到ModuleNotFoundError: No module named 'requests_unixsocket'
      【解决方案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,你可以做同样的事情。

      这是给雪豹的。但我认为它应该也能正常工作。

      【讨论】:

      • >>> import pg >>> print pg.__path__ Traceback(最近一次调用最后一次):文件“”,第 1 行,在 AttributeError: 'module' object has no属性'路径'
      • 它工作,我需要找到 sklearn 包添加到 PYDEV 路径,谢谢。
      • 使用 django.__file__ 而不是 __path__。而且,不,这并不能保证这与站点包有任何关系,但对于 django 之类的东西,您很可能 pip 已安装,当您处于快点,它也可以用于其他目的(例如从文件系统中读取默认配置文件)。
      • 基于这个和其他答案,您可以在命令行的一行中执行此操作,以获取您的 foo.bar 包的路径:python -c "import foo.bar as _; print(_.__path__[0])"
      【解决方案8】:

      所有答案(或:一遍又一遍地重复相同的答案)都是不充分的。你想做的是这样的:

      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 或其他 dist 的问题,但由于它与 easy_install 默认使用的目录完全相同,因此它可能在 easy_install 工作的任何地方都是正确的(所以,在任何地方,甚至是 mac)。玩得开心。注意:原始代码中有很多脏话。

      【讨论】:

      • 谢谢,这非常有用,在带有方括号的 py3 上打印它让我 /usr/local/lib/python3.4/dist-packages 我正在尝试解决如何获取 /usr /lib/python3.4/dist-packages 所以必须进一步发挥。
      • 需要外部库easy_install,如果不可用,也不会优雅地失败:)
      • 确实,这并不完美,但它对我有用并且花了很多时间来弄清楚,所以我把它放在这里希望其他人可以在我花费的时间的基础上再接再厉已经。
      【解决方案9】:

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

      【讨论】:

      • 接受的答案是推荐的方式,所以你应该说明为什么你的更好,因为它有点像黑客
      • 黑客有什么问题? ;) 如果您以交互方式工作,它会更简单、更容易理解和记住。
      【解决方案10】:

      这对我有用:

      python -m site --user-site
      

      【讨论】:

      • 对我来说,这指向一个甚至不存在的文件夹 (~/.local/lib/python2.7/site-packages)。
      • 同样,在 OS X Mavericks 中,我的家 .local 不是我想要它找到的,而且它不是真的在那里。
      • 它在我的主 /Library 文件夹中,我不得不手动导航到它,由于某种原因,直接完整路径不起作用
      • 我如何使用这里安装的软件包?如果我这样做virtualenv 它抱怨该包不存在。如何调用安装在自定义位置的包?
      • 这告诉你 Python 将在哪里寻找用户特定的包。在这种情况下,诸如“甚至不存在”和“不是我希望它找到的东西”之类的评论没有意义。
      【解决方案11】:
      >>> import site; site.getsitepackages()
      ['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
      

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

      【讨论】:

      • 这很好,但不幸的是,这个函数只能从 python2.7 获得。因此,如果您使用的是 python2.7 或更高版本,但不适用于 python 2.6 及以下版本,这是一个很好的解决方案
      • python -c "导入站点;打印(site.getsitepackages())"
      • 我得到 AttributeError: 'module' object has no attribute 'getsitepackages' 与 virtualenv (python 2.7.8) 一起使用时,下面的 distutils 解决方案虽然有效。
      • @radtek:对于venv,我通过hasattr(sys,'real_prefix') 检测venv,然后从[p for p in sys.path if p.endswith('site-packages')][-1] 启发式地确定站点包(在执行[-1] 之前检查是否找到了一个包。
      • @radtek 站点模块不适用于 virtualenv github.com/pypa/virtualenv/issues/355
      【解决方案12】:

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

      【讨论】:

      • 如果我没记错的话,dist-packages 是 Debian 及其衍生产品特有的。
      • @SamuelSantana 你是对的。 dist-packages 特定于基于 debian 的系统。在这种情况下,我从系统安装中调用了site.getsitepackages(),因此是 dist-packages,其他安装将显示 site-packages。
      【解决方案13】:

      由于其“低技术”性质,这应该适用于进出虚拟环境的所有发行版。 os 模块总是驻留在 'site-packages' 的父目录中

      import os; print(os.path.dirname(os.__file__) + '/site-packages')
      

      要将目录更改为站点包目录,我使用以下别名(在 *nix 系统上):

      alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
      

      【讨论】:

      • 我喜欢你的低技术方法。这是一个独立于平台的版本: import os; print(os.path.join(os.path.dirname(os.__file__), 'site-packages'))
      • 我的原始代码也是平台无关的。 Windows 接受正斜杠 ('/') 和反斜杠 (``) 作为路径分隔符。在 Windows 上使用反斜杠更为常见。
      【解决方案14】:

      回答老问题。但是为此使用 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 目录,而是安装包的目录。这也仅在您使用 iPython 而不能以编程方式获取安装目录时才有用。
      【解决方案15】:

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

      1. 全局 site-packages ("dist-packages") 目录在您运行时列在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 目录。在 Python 3 中,您可以改用 sysconfig module

        python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])'
        
      2. 每个用户 site-packages 目录 (PEP 370) 是 Python 安装本地包的位置:

        python -m site --user-site
        

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

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


      实用技巧

      • &lt;package&gt;.__path__ 可让您识别特定包裹的位置:(details)

        $ python -c "import setuptools as _; print(_.__path__)"
        ['/usr/lib/python2.7/dist-packages/setuptools']
        
      • &lt;module&gt;.__file__ 可让您识别特定模块的位置:(difference)

        $ python3 -c "import os as _; print(_.__file__)"
        /usr/lib/python3.6/os.py
        
      • 运行 pip show &lt;package&gt; 以显示 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
        

      【讨论】:

      • virtualenv中有一个站点包目录。您可以使用 python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())" 获取 virtualenv 内部/外部特定于站点的模块的目录(它也适用于 Python 2 和 3)。
      • 不错。并获得第一个:python -c "import site; print(site.getsitepackages()[0])"
      • 这应该在任何使用python的基础教程中。我已经使用 python 多年了,不知道站点模块。本来可以省去很多麻烦的……
      • 我建议更改 Python 的官方教程。详情请查看PR #16974,感谢@salotz 的建议!
      • 我认为stackoverflow.com/a/52638888/1365918 是这个问题的最佳答案。
      【解决方案16】:

      我必须为我正在处理的项目做一些稍微不同的事情:找到相对于基本安装前缀的 relative 站点包目录。如果站点包文件夹在/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 的内容。

      【讨论】:

        【解决方案17】:

        现代标准库方法是使用 sysconfig 模块,在 2.7 和 3.2+ 版本中可用。 与当前接受的答案不同,无论您是否拥有活动的虚拟环境,此方法仍然有效。

        注意sysconfig (source) 不应与此处其他几个答案中提到的 distutils.sysconfig 子模块 (source) 混淆。后者是一个完全不同的模块,它缺少下面讨论的get_paths 函数。

        Python 目前使用 8 个 路径 (docs):

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

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

        【讨论】:

        • 这是一个很好的答案,我很高兴新的 sysconfig 模块使这变得更容易。有没有办法获得本地前缀platlib,例如/usr/local/lib/python3.6/site-packages?传统上,本地安装的东西应该放在/usr/local
        • 这个问题的最佳答案很简单!谢谢你。我发现唯一缺少的是在遇到导入语句时检查这些位置的顺序。此外,在加载 python 时,这些位置中的任何一个是否已预先搜索/缓存?知道这对 IMO 也很有用。
        • 在使用 --system-site-packages 创建的 venv 中,这不会列出所有搜索到的目录 - 特别是仍在搜索的系统站点目录未在此处列出...
        • 同意其他cmets。这是对这个问题的绝妙答案,并且在我尝试过的所有情况下都有效。
        【解决方案18】:

        pip show 将提供有关包的所有详细信息: https://pip.pypa.io/en/stable/reference/pip_show/[点子秀][1]

        获取位置:

        pip show <package_name>| grep Location
        

        在 Linux 中,您可以通过以下方式进入 site-packages 文件夹:

        cd $(python -c "import site; print(site.getsitepackages()[0])")
        

        【讨论】:

        • 在末尾添加 OS X 的 'cut' 命令也会给你字符串:pip3 show foo | grep Location | cut -d ' ' -f 2
        • 对于 Windows,当它必须被使用时,findstr 代替 grep 有效。所以,python -m pip show numpy | findstr "Location" 给出了Location: c:\users\bballdave025\appdata\local\programs\python\python38\lib\site-packages。您使用pip 安装的模块位于site packages。你可以很确定site-packagespip 本身的位置——正如python -m pip ... 所调用的那样。所以,python -m pip show pip | findstr "Location" 显示了与我们从numpy 获得的site-packages 相同的路径。除了pip,您几乎总是可以尝试virtualenv (venv) 和setuptools,用于NIX *或 Win
        【解决方案19】:

        你应该试试这个命令来确定 pip 的安装位置

        Python 2

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

        Python 3

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

        【讨论】:

          【解决方案20】:

          如果您安装了两个版本的 Python,我认为有用的未提及的内容,例如3.8 和 3.5 在您的机器上可能有两个名为 site-packages 的文件夹。在这种情况下,您可以使用以下命令指定 python 版本:

          py -3.5 -c "import site; print(site.getsitepackages()[1])
          

          【讨论】:

            【解决方案21】:

            使用poetry的朋友可以通过poetry debug找到自己的虚拟环境路径:

            $ 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/
            

            【讨论】:

              【解决方案22】:

              我做了一个非常简单的函数来完成工作

              import site
              
              
              def get_site_packages_dir():
                      return [p for p  in site.getsitepackages()
                              if "site-packages" in p][0]
              
              get_site_packages_dir()
              # '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages'
              

              如果要使用终端检索结果:

              python3 -c "import site;print([p for p in site.getsitepackages() if 'site-package' in p][0])"
              
              /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages
              
              
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2022-01-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-06-01
                • 2020-01-25
                相关资源
                最近更新 更多