2012-05-21 68 views
18

Tôi muốn cài đặt một số gói vào thư mục của bên thứ ba site-packages (ngoài vị trí hệ thống chuẩn). Có cách nào để thiết lập này sao cho các tập tin .pth trong đó được tôn trọng?Tạo thư mục gói trang web phụ (và tải các gói từ tệp .pth trong đó)


Bối cảnh: Tôi đang sử dụng OS X, virtualenv và homebrew. Có một vài gói (đặc biệt là wxPython trong trường hợp của tôi) mà không cài đặt độc đáo thông qua pip vào virtualenv. Trong những trường hợp này, có những gói homebrew hoạt động thay cho chúng. Homebrew tạo thư mục gói trang web thứ ba trong /usr/local/lib/python2.7. Tôi muốn chỉ đơn giản là trỏ đến thư mục này và để bảo trì tất cả các mục có dưới sự kiểm soát của brew. Có vẻ như, tuy nhiên, điều này là không thể.

Tôi chắc chắn không phải là người duy nhất quan tâm đến vấn đề này. Tôi muốn đặt cược một số lượng lớn các câu hỏi chung 'không làm việc' và các bài đăng trực tuyến mà tôi đã tình cờ gặp phải liên quan đến vấn đề này. Có một giải pháp tốt?

Trả lời

17

Hãy xem mô-đun site. Nó cung cấp các chức năng addsitedir mà nên làm những gì bạn muốn.

Cách dễ nhất để sử dụng này sẽ tạo ra một file có tên sitecustomize.py hoặc usercustomize.py và đặt nó trong một PYTHONPATH thư mục hiện hành (hoặc bất kỳ thư mục đó kết thúc lên trên sys.path) với nội dung sau:

import site 
site.addsitedir('/usr/local/lib/python2.7') 

Khi Python bắt đầu một nỗ lực được thực hiện để nhập sitecustomize và sau đó usercustomize, đó là lý do tại sao tính năng này hoạt động. Từ tài liệu trang web:

Sau khi thao tác với đường dẫn này, hãy thực hiện nhập mô-đun có tên sitecustomize, có thể thực hiện các tùy chỉnh riêng cho từng trang web tùy ý. Nó thường được tạo bởi người quản trị hệ thống trong thư mục site-packages. Nếu quá trình nhập này không thành công với ngoại lệ ImportError, nó sẽ bị bỏ qua âm thầm.

Sau đó, một nỗ lực được thực hiện để nhập mô-đun có tên usercustomize, có thể thực hiện các tùy chỉnh dành riêng cho người dùng tùy ý, nếu ENABLE_USER_SITE là đúng. Tệp này được dự định sẽ được tạo trong thư mục gói trang web của người dùng (xem bên dưới), là một phần của sys.path trừ khi bị vô hiệu hóa theo số -s. An ImportError sẽ bị bỏ qua âm thầm.

+0

Do sitecustomize.py hoặc usercustomize.py tự động được chạy khi khởi động? Chỉnh sửa: [có, có họ làm] (http://docs.python.org/library/site.html). Cảm ơn! –

+0

@MattB. Có, đã chỉnh sửa câu trả lời của tôi với một số thông tin bổ sung. Tài liệu này xuất phát từ đầu trang mô-đun trang mà tôi đã liên kết trong câu trả lời của tôi. –

+1

Tôi vẫn không hiểu đầy đủ về cách thức làm việc, nhưng: (1) không nên bởi additionalitedir ('/ usr/local'), tức là tiền tố thay thế (nhưng nó không hoạt động đối với tôi), hoặc (2) additedir ('/ usr/local/lib/python2.7/site-packages') đường dẫn để nối thêm, và trong trường hợp thứ hai đó, tại sao không chỉ thêm nó vào PYTHONPATH? –

1

PEP 370 đặc biệt giải quyết việc tạo ra cho mỗi người dùng site-packages thư mục, để đối phó với những tình huống mà người dùng không có quyền truy cập admin để toàn hệ thống các site-packages.

Ví dụ trên Unix (bao gồm cả Mac OS) và giả sử người dùng đang sử dụng Python 3.6, người ta có thể tạo ra các thư mục sau và đặt .pth tập tin bên trong có

~/.local/lib/python3.6/site-packages

Các vấn đề liên quan