it-swarm-vi.tech

Làm cách nào để tìm vị trí của thư mục gói trang Python của tôi?

Làm cách nào để tìm vị trí của thư mục gói trang web của tôi?

752
Daryl Spitzer

Có hai loại thư mục gói trang web, toàn cầutrên mỗi người dùng.

  1. Các thư mục Global gói trang web (" dist-gói ") được liệt kê trong sys.path khi bạn chạy:

    python -m site
    

    Để có danh sách ngắn gọn hơn, hãy chạy getsitepackages từ mô đun trang web trong mã Python:

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

    Lưu ý : Tuy nhiên, với virtualenvs gotitepackages không có sẵn , sys.path từ trên sẽ liệt kê chính xác thư mục gói trang web của virtualenv.

  2. Thư mục per user site-gói ( PEP 370 ) là nơi Python cài đặt các gói cục bộ của bạn:

    python -m site --user-site
    

    Nếu điều này trỏ đến một thư mục không tồn tại, hãy kiểm tra trạng thái thoát của Python và xem python -m site --help để biết giải thích.

    Gợi ý : Chạy pip list --user hoặc pip freeze --user cung cấp cho bạn danh sách tất cả các cài đặt trên mỗi người dùng gói trang web.


Những mẹo có ích

  • <package>.__path__ cho phép bạn xác định (các) vị trí của gói cụ thể: ( chi tiết )

    $ python -c "import setuptools as _; print(_.__path__)"
    ['/usr/lib/python2.7/dist-packages/setuptools']
    
  • <module>.__file__ cho phép bạn xác định vị trí của một mô-đun cụ thể: ( sự khác biệt )

    $ python3 -c "import os as _; print(_.__file__)"
    /usr/lib/python3.6/os.py
    
  • Chạy pip show <package> để hiển thị thông tin gói kiểu 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
    
256
Peterino
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

(hoặc chỉ mục đầu tiên với site.getsitepackages()[0])

627
eudoxos

Từ Tài liệu "Cách cài đặt Django" (mặc dù điều này hữu ích cho nhiều hơn là chỉ cài đặt Django) - thực hiện các thao tác sau từ Shell:

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

Được định dạng để dễ đọc (thay vì sử dụng như một lớp lót), trông giống như sau:

from distutils.sysconfig import get_python_lib
print(get_python_lib())
301
Daryl Spitzer

Dành cho Ubuntu ,

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

... không đúng.

Nó sẽ chỉ cho bạn /usr/lib/pythonX.X/dist-packages

Thư mục này chỉ chứa các gói mà hệ điều hành của bạn đã tự động cài đặt để các chương trình chạy.

Trên Ubuntu , thư mục gói trang có chứa các gói được cài đặt qua setup_tools\easy_install\pip sẽ ở trong /usr/local/lib/pythonX.X/dist-packages

Thư mục thứ hai có lẽ là thư mục hữu ích hơn nếu trường hợp sử dụng có liên quan đến cài đặt hoặc đọc mã nguồn.

Nếu bạn không sử dụng Ubuntu, có lẽ bạn đã sao chép an toàn hộp mã đầu tiên vào thiết bị đầu cuối.

98
David Hollander

Đây là những gì làm việc cho tôi:

python -m site --user-site
64
Ramashri

Giả sử bạn đã cài đặt gói 'Django'. nhập nó và gõ vào dir (Django). Nó sẽ cho bạn thấy, tất cả các chức năng và thuộc tính với mô-đun đó. Nhập vào trình thông dịch python - 

>>> import Django
>>> dir(Django)
['VERSION', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'get_version']
>>> print Django.__path__
['/Library/Python/2.6/site-packages/Django']

Bạn có thể làm điều tương tự nếu bạn đã cài đặt Mercurial.

Đây là cho báo tuyết. Nhưng tôi nghĩ rằng nó nên làm việc nói chung là tốt.

22
Sumod

Như những người khác đã lưu ý, distutils.sysconfig có các cài đặt liên quan:

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

... mặc dù site.py mặc định làm một cái gì đó thô thiển hơn một chút, được diễn giải dưới đây:

import sys, os
print os.sep.join([sys.prefix, 'lib', 'python' + sys.version[:3], 'site-packages'])

(nó cũng thêm ${sys.prefix}/lib/site-python và thêm cả hai đường dẫn cho sys.exec_prefix, nếu hằng số đó khác nhau).

Điều đó nói rằng, bối cảnh là gì? Bạn không nên trực tiếp nhắn tin với site-packages; setuptools/distutils sẽ hoạt động để cài đặt và chương trình của bạn có thể đang chạy trong virtualenv nơi pythonpath của bạn hoàn toàn do người dùng cục bộ, do đó không nên sử dụng trực tiếp các gói trang web hệ thống.

21
Charles Duffy

Có thể tìm thấy các gói hệ thống gốc được cài đặt với cài đặt python trong các hệ thống dựa trên Debian tại:

/usr/lib/python2.7/dist-packages/

Trong OSX - /Library/Python/2.7/site-packages

bằng cách sử dụng mã nhỏ này:

from distutils.sysconfig import get_python_lib
print get_python_lib()

Tuy nhiên, danh sách các gói được cài đặt qua pip có thể được tìm thấy tại:

/ usr/địa phương/bin /

Hoặc người ta có thể chỉ cần viết lệnh sau để liệt kê tất cả các đường dẫn có các gói python.

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

Lưu ý: vị trí có thể thay đổi dựa trên HĐH của bạn, như trong 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']
15
fnatic_shank

Tất cả các câu trả lời (hoặc: cùng một câu trả lời lặp đi lặp lại) là không đầy đủ. Những gì bạn muốn làm là đây:

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

Dòng cuối cùng cho bạn thấy các dir cài đặt. Hoạt động trên Ubuntu, trong khi những cái trên thì không. Đừng hỏi tôi về windows hoặc các dists khác, nhưng vì nó chính là cùng một dir mà easy_install sử dụng theo mặc định, nên nó có thể chính xác ở mọi nơi mà easy_install hoạt động (vì vậy, ở mọi nơi, thậm chí cả mac). Chúc vui vẻ. Lưu ý: mã gốc có nhiều từ ngữ trong đó.

13
cheater

Lưu ý phụ: Giải pháp được đề xuất (distutils.sysconfig.get_python_lib()) không hoạt động khi có nhiều hơn một thư mục gói trang web (như được đề xuất bởi bài viết này ). Nó sẽ chỉ trả về thư mục gói trang web chính.

Than ôi, tôi cũng không có giải pháp nào tốt hơn. Python dường như không theo dõi các thư mục gói trang web, chỉ các gói trong chúng.

11
user147100

Điều này hiệu quả với tôi . Nó sẽ giúp bạn có cả thư mục gói và gói trang web . Nếu thư mục không nằm trên đường dẫn của Python, dù sao nó cũng sẽ tốt.

import sys; 
print [f for f in sys.path if f.endswith('packages')]

Đầu ra (cài đặt Ubuntu):

['/home/username/.local/lib/python2.7/site-packages',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages']
9
just_an_old_guy

Một cách stdlib hiện đại đang sử dụng mô-đun sysconfig , có sẵn trong phiên bản 2.7 và 3.2+.

Lưu ý : sysconfig ( nguồn ) không bị nhầm lẫn với distutils.sysconfig mô hình con ( nguồn ) được đề cập trong Một số câu trả lời khác ở đây. Cái sau là một mô-đun hoàn toàn khác và nó thiếu chức năng get_paths được thảo luận dưới đây.

Python hiện sử dụng các đường dẫn tám ( docs ):

  • stdlib : thư mục chứa tệp Python thư viện không dành riêng cho nền tảng.
  • platstdlib : thư mục chứa tệp thư viện Python tiêu chuẩn dành riêng cho nền tảng.
  • platlib : thư mục dành cho các tệp cụ thể theo trang web, dành riêng cho nền tảng.
  • purelib : thư mục dành cho các tệp dành riêng cho trang web, không dành riêng cho nền tảng.
  • bao gồm : thư mục cho các tệp tiêu đề không dành riêng cho nền tảng.
  • platinclude : thư mục cho các tệp tiêu đề dành riêng cho nền tảng.
  • scripts : thư mục cho các tệp script.
  • data : thư mục cho các tệp dữ liệu.

Trong hầu hết các trường hợp, người dùng tìm thấy câu hỏi này sẽ quan tâm đến đường dẫn 'purelib' (trong một số trường hợp , bạn cũng có thể quan tâm đến 'platlib'). Không giống như câu trả lời được chấp nhận hiện tại, phương pháp này vẫn hoạt động bất kể bạn có kích hoạt virtualenv hay không.

Ở cấp độ hệ thống (đây là Python 3.7.0 trên hệ điều hành mac):

>>> import sysconfig
>>> sysconfig.get_paths()['purelib']
'/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages'

Với một venv, bạn sẽ nhận được một cái gì đó như thế này

>>> import sysconfig
>>> sysconfig.get_paths()['purelib']
'/private/tmp/.venv/lib/python3.7/site-packages'

Một tập lệnh Shell cũng có sẵn để hiển thị các chi tiết này, mà bạn có thể gọi bằng cách thực thi sysconfig dưới dạng một mô-đun:

python -m sysconfig
9
wim

Một lưu ý bổ sung cho hàm get_python_lib đã được đề cập: trên một số nền tảng, các thư mục khác nhau được sử dụng cho các mô-đun cụ thể của nền tảng (ví dụ: các mô-đun yêu cầu biên dịch). Nếu bạn chuyển plat_specific=True cho chức năng, bạn sẽ nhận được các gói trang web cho các gói cụ thể của nền tảng.

8
Armin Ronacher

Điều này sẽ hoạt động trên tất cả các bản phân phối trong và ngoài môi trường ảo do tính chất "công nghệ thấp" của nó. Mô-đun os luôn nằm trong thư mục mẹ của 'gói trang web'

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

Để thay đổi thư mục thành thư mục gói trang web, tôi sử dụng bí danh sau (trên các hệ thống * nix):

alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
8
Pyramid Newbie
from distutils.sysconfig import get_python_lib
print get_python_lib()
7
Florian Bösch

pip show sẽ cung cấp tất cả các chi tiết về một gói: https://pip.pypa.io/en/urdy/reference/pip_show/ [pip show] [1]

Để có được vị trí:

pip show <package_name>| grep Location
3
Sourabh Potnis

Trả lời câu hỏi cũ. Nhưng sử dụng ipython cho việc này. 

pip install ipython
ipython 
import imaplib
imaplib?

Điều này sẽ cung cấp đầu ra sau đây về gói 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
2
Sahil Agarwal

Tôi đã phải làm một cái gì đó hơi khác cho một dự án mà tôi đang thực hiện: tìm thư mục tương đối site-gói liên quan đến tiền tố cài đặt cơ sở. Nếu thư mục gói trang web nằm trong /usr/lib/python2.7/site-packages, tôi muốn có phần /lib/python2.7/site-packages. Trên thực tế, tôi đã gặp phải các hệ thống có site-packages nằm trong /usr/lib64 và câu trả lời được chấp nhận KHÔNG hoạt động trên các hệ thống đó. 

Tương tự như câu trả lời của kẻ lừa đảo, giải pháp của tôi nhìn sâu vào ruột của Distutils, để tìm ra con đường thực sự được truyền qua bên trong setup.py. Thật là một nỗi đau khi tôi không muốn bất cứ ai phải tìm hiểu điều này một lần nữa.

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

Điều đó sẽ in một cái gì đó như /Lib/site-packages hoặc /lib/python3.6/site-packages.

0
MultipleMonomials

Nếu nó đã được thêm vào PYTHONPATH, bạn cũng có thể làm một cái gì đó như

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

Bạn nên thử lệnh này để xác định vị trí cài đặt của pip

Con trăn 2

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

Con trăn 3

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