簡體   English   中英

如何找到我的 Python 站點包目錄的位置?

[英]How do I find the location of my Python site-packages directory?

如何找到我的站點包目錄的位置?

有兩種類型的站點包目錄, globalper user

  1. 運行時,全局站點包(“ dist-packages ”)目錄列在sys.path

     python -m site

    要獲得更簡潔的列表,請使用 Python 代碼從site 模塊運行getsitepackages

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

    注意:雖然virtualenvs getsitepackages is not available ,但上面的sys.path將正確列出 virtualenv 的 site-packages 目錄。 在 Python 3 中,您可以改用sysconfig 模塊

     python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])'
  2. 每個用戶的站點包目錄 ( PEP 370 ) 是 Python 安裝本地包的地方:

     python -m site --user-site

    如果這指向一個不存在的目錄,請檢查 Python 的退出狀態並查看python -m site --help以獲取解釋。

    提示:運行pip list --userpip freeze --user為您提供每個用戶站點包的所有安裝列表。


實用技巧

  • <package>.__path__可讓您識別特定包的位置:( 詳細信息

     $ 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]第一項)

一個解決方案:

  • 在 virtualenv 之外 - 提供全局站點包的路徑,
  • 在 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())


來源:一個非常舊版本的“如何安裝 Django”文檔(盡管這不僅對 Django 安裝有用)

對於 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,你可以做同樣的事情。

這是給雪豹的。 但我認為它也應該適用於一般情況。

現代 stdlib 方式是使用sysconfig模塊,在 2.7 和 3.2+ 版本中可用。 與當前接受的答案不同,無論您是否有虛擬環境活動,此方法仍然有效。

注意:不要將sysconfig ( source ) 與這里其他幾個答案中提到的distutils.sysconfig子模塊 ( source ) 混淆。 后者是一個完全不同的模塊,它缺少下面討論的get_paths函數。

Python 目前使用八個路徑 ( docs ):

  • stdlib :包含非特定於平台的標准 Python 庫文件的目錄。
  • platstdlib :包含特定於平台的標准 Python 庫文件的目錄。
  • platlib :特定於站點、特定於平台的文件的目錄。
  • purelib :站點特定的、非平台特定的文件的目錄。
  • include :非平台特定頭文件的目錄。
  • platinclude :特定於平台的頭文件的目錄。
  • 腳本:腳本文件的目錄。
  • 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

正如其他人所指出的, 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']

旁注:建議的解決方案 ( distutils.sysconfig.get_python_lib() ) 在有多個站點包目錄時不起作用(如本文推薦)。 它只會返回主站點包目錄。

唉,我也沒有更好的解決方案。 Python 似乎不跟蹤 site-packages 目錄,只跟蹤其中的包。

pip show 將提供有關包的所有詳細信息: https : //pip.pypa.io/en/stable/reference/pip_show/ [pip show][1]

獲取位置:

pip show <package_name>| grep Location

在 Linux 中,您可以通過以下方式進入 site-packages 文件夾:

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

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

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 工作的任何地方都是正確的(因此,任何地方,甚至是 macs)。 玩得開心。 注意:原始代碼中有很多臟話。

由於它的“低技術”性質,這應該適用於虛擬環境內外的所有發行版。 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'

這對我有用。 它將為您提供 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傳遞給該函數,您將獲得平台特定包的站點包。

from distutils.sysconfig import get_python_lib
print get_python_lib()

您應該嘗試使用此命令來確定 pip 的安裝位置

蟒蛇 2

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

蟒蛇3

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

回答老問題。 但是為此使用 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

對於那些使用詩歌的人,你可以通過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/

我做了一個非常簡單的函數來完成工作

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


我必須為我正在處理的項目做一些稍微不同的事情:找到相對於基本安裝前綴的相對站點包目錄。 如果 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

一些我認為有用的尚未提及的內容,如果您安裝了兩個版本的 Python,例如 3.8 和 3.5,則您的機器上可能有兩個名為 site-packages 的文件夾。 在這種情況下,您可以使用以下命令指定 python 版本:

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

如果已將其添加到PYTHONPATH ,則還可以執行以下操作

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM