Câu trả lời:
Có hai loại thư mục gói trang web, toàn cầu và mỗi người dùng .
Các thư mục gói toàn cầu (" dist-gói ") được liệt kê sys.path
khi bạn chạy:
python -m site
Để có danh sách ngắn gọn hơn 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 các phần mềm ảoenvs 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. Trong Python 3, bạn có thể sử dụng mô-đun sysconfig thay thế:
python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])'
Thư mục gói trang web trên mỗi người dùng ( 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
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 gói trang web được cài đặt cho mỗi người dùng .
<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
python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
(nó cũng hoạt động trên cả Python 2 và 3).
python -c "import site; print(site.getsitepackages()[0])"
>>> 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]
)
hasattr(sys,'real_prefix')
và sau đó xác định các gói trang web theo phương pháp heuristur [p for p in sys.path if p.endswith('site-packages')][-1]
(cộng với kiểm tra nếu có một cái được tìm thấy trước khi thực hiện [-1]
.
Một giải pháp:
... Đây là một lớp lót:
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())
Nguồn: một phiên bản rất cũ của tài liệu "Cách cài đặt Django" (mặc dù điều này hữu ích với nhiều thứ hơn là chỉ cài đặt Django)
cdsitepackages
, để trực tiếp thay đổi vào thư mục gói trang web của môi trường.
/usr/lib/python3/dist-packages
thay vì /usr/lib/python3.5/dist-packages
.
Đối với 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 web chứa các gói được cài đặt qua setup_tools \ easy_install \ pip sẽ nằm 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.
module.__file__
là cách tốt hơn. Nếu họ đang cố gắng cài đặt mọi thứ, hãy sử dụng các công cụ.
'/usr/lib/pythonX.X/dist-packages' in site.getsitepackages()
trên Ubuntu (mặc dù nó đi sau /usr/local/...
trong danh sách). Bạn chỉ nhận được một cái gì đó /usr/local
thông qua sudo pip
và bạn không nên sử dụng sudo pip
trên Ubuntu trừ khi bạn quyết định tự phân phối: nếu bạn sử dụng sudo pip
, bạn có trách nhiệm đảm bảo rằng tất cả các phụ thuộc của các mô-đun python hiện tại và tương lai được cài đặt thông qua sudo apt
hoặc sudo pip
tương thích. Xem xét vấn đề nào virtualenv
được tạo ra để giải quyết
dist-packages
Ubuntu 2 trong (L).
Đây là những gì làm việc cho tôi:
python -m site --user-site
~/.local/lib/python2.7/site-packages
).
virtualenv
đó phàn nàn rằng gói không tồn tại. Làm thế nào để tôi gọi các gói được cài đặt tại một vị trí tùy chỉnh?
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 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 đồng bóng.
Đâ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.
django.__file__
cho việc này hơn là __path__
. và, không, không đảm bảo rằng điều này có liên quan đến các gói trang web, nhưng với những thứ như django, rất có thể bạn đã cài đặt pip , nó sẽ hoạt động khi bạn đang vội và có thể sử dụng nó cho các mục đích khác cũng vậy (ví dụ đọc tệp cấu hình mặc định từ hệ thống tệp).
foo.bar
gói của bạn :python -c "import foo.bar as _; print(_.__path__[0])"
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ù mặc định site.py
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 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 nhắn tin site-packages
trực tiếp với bạn ; 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 của hệ thống.
python2
trên osx và ubfox có và không có virtualenv nhưng hoàn toàn không python3
.
python3
.
Một cách stdlib hiện đại là sử dụng sysconfig
mô-đun, có sẵn trong phiên bản 2.7 và 3.2+.
Lưu ý : sysconfig
( nguồn ) không được 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 get_paths
chức năng được thảo luận dưới đây.
Python hiện sử dụng tám đường dẫn ( docs ):
- stdlib : thư mục chứa các tệp thư viện Python tiêu chuẩn không dành riêng cho nền tảng.
- platstdlib : thư mục chứa các tệp thư viện Python tiêu chuẩn dành riêng cho nền tảng.
- platlib : thư mục cho các tệp cụ thể theo trang web, nền tảng cụ thể.
- 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 tập tin script.
- data : thư mục cho các tập tin 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 kịch bản 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 hiện sysconfig
dưới dạng một mô-đun:
python -m sysconfig
platlib
, ví dụ như /usr/local/lib/python3.6/site-packages
không? Theo truyền thống, những thứ được cài đặt cục bộ nên đi vào /usr/local
.
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']
site.getsitepackages()
từ cài đặt hệ thống do đó các gói dist, các cài đặt khác sẽ hiển thị các gói trang web.
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 xác 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 đó.
easy_install
và không thất bại một cách duyên dáng nếu không có sẵn mà không đủ :)
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 (theo khuyến nghị của 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.
get_python_lib()
khi được chạy từ trong virtualenv hiển thị các gói trang web của Python được sử dụng để tạo virtualenv chứ không phải các gói trang web của virtualenv .
Điều này làm việc cho 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ẽ không giúp bạn nhiều.
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']
Đ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'
Một lưu ý bổ sung cho get_python_lib
chức năng đã đượ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
đến 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.
chương trình pip 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
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
Tôi đã phải làm một cái gì đó hơi khác nhau cho một dự án tôi đang làm việc trên: tìm ra tương đối trang web gói thư mục liên quan đến các cơ sở cài đặt tiền tố. Nếu thư mục gói trang web nằm trong /usr/lib/python2.7/site-packages
, tôi muốn có /lib/python2.7/site-packages
một phần. Trên thực tế, tôi đã gặp phải các hệ thống site-packages
đang ở 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
.
pip show <package name>