Cài đặt gói vào virtualenv bằng apt-get


16

Theo câu trả lời này , apt-getcài đặt các gói trên toàn hệ thống (từ chính tắc) và chỉ pipcó thể cài đặt các gói vào virtualenv (từ Pypi).

Tuy nhiên, tôi cần cài đặt một gói vào virtualenv chỉ có thể truy cập qua apt-get, tức là không được lưu trữ bởi Pypi.

Làm thế nào để làm điều đó?


Câu hỏi hay đấy Pal.
rdʒɑ 4/2/2015

Câu trả lời:


8

Một cách khác là tải xuống tệp với apt-get download, giải nén nó dpkg -xvà di chuyển các tệp được giải nén vào virtualenv của bạn:

Thí dụ:

apt-get download python-xyz

giả sử kết quả này trong:

./python-xyz_1.2.3-3ubuntu5_amd64.deb

Sau đó, sử dụng dpkg để trích xuất phần dữ liệu của tệp .deb:

dpkg -x python-xyz_1.2.3-3ubuntu5_amd64.deb ./xyz-tmp

Trong thư mục mới được tạo ./xyz-tmp, bây giờ bạn có tất cả các tệp đã được cài đặt vào /(root) mà bạn đã sử dụng apt-get install.

Giả sử họ là:

./xyz-tmp/usr/lib/python2.7/dist-packages/xyz/
./xyz-tmp/usr/lib/python2.7/dist-packages/xyz-1.2.3.egg-info

Bạn vẫn cần ánh xạ các thư mục con (ví dụ dist-packagesso với site-packages) và sau đó có thể di chuyển các tệp vào virtualenv của bạn (giả sử là virtualenv /home/user/.virtualenvs/py27):

mv ./xyz-tmp/usr/lib/python2.7/dist-packages/* /home/user/.virtualenvs/py27/lib/python2.7/site-packages/

So với câu trả lời trước đây của tôi, phương pháp này có ưu điểm là bạn không phải nghiên cứu tệp nào đã được cài đặt, bởi vì bạn có thể thấy chúng trong thư mục giải nén. Nó vẫn yêu cầu ánh xạ các thư mục giữa kho lưu trữ được trích xuất và virtualenv.


+1, đây là một ví dụ khác về cách tiếp cận này, hoạt động khá tốt để cài đặt các gói chỉ có thể truy cập qua APT vào virtualenv - đã làm một cái gì đó tương tự gần đây bằng Python 3.7.
RichVel

0

Tất cả những gì cần thiết cho một virtualenv là sự hiện diện của các tệp gói trong cây con của virtualenv của bạn. Vì vậy, miễn là bạn có thể xác định tệp nào đã được cài đặt vào hệ thống Python thông qua apt-get, bạn có thể sao chép chúng vào virtualenv của mình. Điều này bao gồm các tệp trong thư mục gói trang web cũng như ở những nơi khác trong cây con Python của bạn (ví dụ: tập lệnh).

Ví dụ giả thuyết:

sudo apt-get python-xyz

Giả sử nó cài đặt gói có tên "xyz" vào hệ thống Python 2.7 của bạn, bạn có thể nhận được điều này:

/usr/lib/python2.7/dist-packages/xyz/
/usr/lib/python2.7/dist-packages/xyz-1.2.3.egg-info

Sao chép các tệp liên quan đến gói "xyz" vào virtualenv của bạn (giả sử là virtualenv /home/user/.virtualenvs/py27):

/home/user/.virtualenvs/py27/lib/python2.7/site-packages/xzy/
/home/user/.virtualenvs/py27/lib/python2.7/site-packages/xzy-1.2.3.egg-info

Khó khăn là (1) trong việc xác định tệp nào thuộc về một gói cụ thể và (2) trong việc ánh xạ các thư mục con tương ứng giữa hệ thống Python và virtualenv (ví dụ dist-packagesso với site-packagestrong ví dụ trên).

Nếu bất cứ ai có nhiều kinh nghiệm với điều này, xin vui lòng bình luận.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.