programing

Python site-packages 디렉토리의 위치를 찾으려면 어떻게 해야 합니까?

javaba 2022. 9. 23. 23:21
반응형

Python site-packages 디렉토리의 위치를 찾으려면 어떻게 해야 합니까?

사이트 패키지 디렉토리의 위치를 확인하려면 어떻게 해야 합니까?

사이트 패키지 디렉토리에는 글로벌과 사용자별 가지 유형이 있습니다.

  1. 글로벌 사이트 패키지("dist-packages") 디렉토리는 다음과 같습니다.sys.path「 」:

     python -m site
    

    는, 을 참조해 주세요.getsitepackages사이트 모듈의 Python 코드:

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

    주의:가상 환경에서는 이전 버전의 에서는 getsite package를 사용할 수 없습니다.sys.path단, virtualenv의 site-langed 디렉토리가 올바르게 표시됩니다.Python 3에서는 대신 sysconfig 모듈을 사용할 수 있습니다.

     python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])'
    
  2. per user site-packages 디렉토리(PEP 370)는 Python이 로컬 패키지를 설치하는 곳입니다.

     python -m site --user-site
    

    하지 않는 있는 는, 의 해 주세요.또, Python 의 종료 상태를 참조해 주세요.python -m site --help를 참조해 주세요.

    힌트: 실행 중pip list --user ★★★★★★★★★★★★★★★★★」pip 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 스 deb deb deb deb deb deb deb :

      $ 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])

다음과 같은 솔루션:

  • outside of virtualenv - 글로벌 사이트 액세스 경로를 제공합니다.
  • virtualenv의 insid - 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을 통해 설치된 패키지를 포함하는 사이트 패키지 폴더가 있습니다./usr/local/lib/pythonX.X/dist-packages

사용 사례가 설치 또는 소스 코드 읽기와 관련된 경우 두 번째 폴더가 더 유용할 수 있습니다.

Ubuntu 를 사용하지 않는 경우는, 최초의 코드 박스를 단말기에 카피 페이스트 하는 것이 안전합니다.

이것이 나에게 효과가 있었다.

python -m site --user-site

최신 stdlib 방식은 버전 2.7 및 3.2 이상에서 사용할 수 있는 모듈을 사용하는 것입니다.현재 허용된 답변과 달리 이 방법은 가상 환경이 활성 상태인지 여부에 관계없이 계속 작동합니다.

주의:sysconfig(source)는 (source)와 혼동해서는 안 됩니다.distutils.sysconfig서브모듈(소스)에 대해서는, 다음의 몇개의 회답에 기재되어 있습니다.후자는 완전히 다른 모듈로, 이 모듈에는get_paths아래에 설명되어 있습니다. ★★★★★distutils3.10에서 폐지되어 곧 사용할 수 없게 됩니다.

Python은 현재 8개의 경로(docs)를 사용하고 있습니다.

  • stdlib: 플랫폼 고유하지 않은 표준 Python 라이브러리 파일을 포함하는 디렉토리.
  • platstdlib: 플랫폼 고유의 표준 Python 라이브러리 파일을 포함하는 디렉토리.
  • platlib : 사이트 고유 플랫폼 고유 파일용 디렉토리.
  • purelib : 사이트 고유 파일, 플랫폼 고유 파일 이외의 파일용 디렉토리.
  • include: 플랫폼 고유하지 않은 헤더 파일의 디렉토리.
  • platinclude : 플랫폼 고유의 헤더 파일 디렉토리.
  • scripts: 스크립트파일 디렉토리
  • data: 데이터 파일의 디렉토리.

대부분의 경우 이 질문을 발견한 사용자는 'purelib' 경로에 관심을 가질 것입니다(어떤 경우에는 'platlib'에도 관심이 있을 수 있습니다).purelib 패스는 등의 툴을 사용하여 일반적인 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

정맥을 사용하면 이런 증상이 나타날 수 있습니다.

# 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

함수는 관련된 모든 설치 경로의 dict를 반환합니다(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'}

세부사항을 셸도 사용할 수 있습니다. 스크립트는, 「이러다」를 하고, 할 수 .sysconfig★★★★★★★★★★★★★★★★★★:

python -m sysconfig

부록:데비안 / 우분투는?

일부 코멘트가 지적하듯이, Debian 시스템(및 Ubuntu, 파생 모델)의 sysconfig 결과는 정확하지 않습니다.사용자 pip이 패키지를 설치할 때 Python 패키징에 대한 Debian 정책에 따라 패키지는 사이트 패키지가 아닌 dist-packages에 들어갑니다.

불일치의 근본 원인은 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 설치가 약간 해킹된 것 같습니다.또한 디스트리뷰트를 완전히 사용할 수 없게 되었을 때 3.12+에 대한 새로운 계획을 강구해야 합니다.아마 sysconfig도 패치 적용을 시작해야 할 것입니다.이는 설치 장소에 pip을 사용하기 때문입니다.

'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-packagessetuptools/distutils는 설치를 위해 작동하며, pythonpath가 완전히 사용자 로컬인 virtualenv에서 프로그램이 실행 중일 수 있으므로 시스템 사이트 맵을 직접 사용하는 것도 가정하지 마십시오.

Debian 기반 시스템에 python 설치와 함께 설치된 네이티브 시스템 패키지는 다음 URL에서 찾을 수 있습니다.

/usr/lib/dist-dist-dist-filters 2.7/dist-filter/

경우 - OSX의 경우 -/Library/Python/2.7/site-packages

다음 작은 코드를 사용합니다.

from distutils.sysconfig import get_python_lib
print get_python_lib()

다만, 「」를 개입시켜 되고 있는 의 리스트는, 「」를 참조해 주세요.pip의 URL은 : 、 음 、 다 、 다 can can can can can can。

/usr/local/bin/

또는 다음 명령을 작성하여 python 패키지가 있는 모든 경로를 나열할 수도 있습니다.

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

주의: OSX와 같이 OS에 따라 위치가 다를 수 있습니다.

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

pip show는 패키지에 대한 모든 세부 정보를 제공합니다.https://pip.pypa.io/en/stable/reference/pip_show/ [filename showledge show ]

위치를 가져오려면:

pip show <package_name>| grep Location

Linux 에서는 다음 방법으로 사이트 패키지 폴더로 이동할 수 있습니다.

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에서는 동작하지만, 위의 것은 동작하지 않습니다.윈도나 기타 디스트에 대해서는 묻지 마십시오.단, easy_install이 기본적으로 사용하는 것과 동일한 dir이기 때문에 easy_install이 동작하는 모든 장소(어디서나, 심지어 Mac에서도)에서 사용할 수 있습니다.즐겁게 보내세요.주의: 오리지널 코드에는 많은 욕설이 포함되어 있습니다.

난 이거면 돼.그러면 Dist-Package 폴더와 Site-Package 폴더가 모두 표시됩니다.폴더가 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']

이 방법은 "로테크" 특성상 가상 환경 안팎의 모든 배포에서 작동해야 합니다.os 모듈은 항상 'site-packages'의 상위 디렉토리에 있습니다.

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

dir를 site-packages dir로 변경하려면 다음 에일리어스를 사용합니다(*nix 시스템).

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

참고 사항:제안된 솔루션(distutils.sysconfig.get_python_lib()( 문서에서 권장하는 바와 같이) 여러 개의 사이트 맵디렉토리가 있는 경우,는 기능하지 않습니다.메인 사이트 패키지 디렉토리만 반환됩니다.

아아, 나도 더 나은 해결책은 없다.Python은 사이트 패키지 디렉토리를 추적하지 않고 그 안에 있는 패키지만 추적하는 것 같습니다.

「 」의 추가 .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 p.endswith(("site-packages", "dist-packages"))][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 p.endswith(('site-packages', 'dist-packages')) ][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,, where, 는, 는, where, where, where, where, where, where, where, where, where, where, where, where, where, where, where, where, where, where, site-packages was/usr/lib64인정된 답변은 이들 시스템에서는 동작하지 않았습니다.

로, 내 , 실제로 이다.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의 2가지 버전이 설치되어 있는 경우(3.8과 3.5 모두) site-packages라고 불리는 2개의 폴더가 머신에 있을 수 있습니다.이 경우 다음을 사용하여 python 버전을 지정할 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/122327/how-do-i-find-the-location-of-my-python-site-packages-directory

반응형