Cài đặt lại các gói tự động vào môi trường ảo sau khi nâng cấp phiên bản chính của Python


10

Tôi đã có một số môi trường ảo (hàng chục) nằm trên đĩa được tạo bởi venvmô-đun Python 3.6. Bây giờ tôi đã nâng cấp lên Ubuntu 19.10 một cách vội vàng và chỉ sau đó nhận thấy rằng 3.6 hoàn toàn không có sẵn cho Ubuntu 19.10 từ các nguồn được thừa nhận chung. Tôi đã quản lý để nâng cấp các phiên bản Python của các môi trường ảo này bằng cách định vị bin/python3trong thư mục chính của tôi và chạy python3.7 -mvenv --upgradetrên các thư mục chứa.

Bây giờ, trong khi python3.7 -mvenv --upgradenâng cấp Python trong môi trường ảo, không có gì để cài đặt lại các phiên bản gói trước của tôi trong lib/python3.7/site-packagesđó venv. Tôi đoán tôi có thể làm điều này bằng cách cài đặt Python 3.6, pip freezeing các yêu cầu từ venvvà sau đó nâng cấp venv để Python 3.7, pip install -ring - nếu chỉ có Python 3.6 cài đặt sẵn cho hệ điều hành mới của tôi.

Có cách nào khác để thực hiện việc này theo cách khá tự động (có lẽ chủ yếu là pip freezesử dụng lib/python3.6thư mục cũ ) mà không cần tôi phải cài đặt Python 3.6 từ nguồn, sử dụng conda hoặc cài đặt 3.6 từ một số PPA ngẫu nhiên? Tôi muốn nâng cấp tất cả các môi trường để trong tương lai khi tôi cần làm gì đó với một môi trường ngẫu nhiên, nó sẽ tiếp tục hoạt động với Python 3.7.

Câu trả lời:


11

Trong 3.7 venv mới của bạn, bạn nên có pkg_resourcessẵn - setuptoolsđược cài đặt tự động khi được tạo. Nếu không, chỉ cần pip install setuptools.

setuptoolsmã thư viện thực sự là những gì pipđược trả thù để làm cho pip freezecông việc. Nhưng bạn chỉ có thể đóng băng nó bằng tay.

# in 3.7 runtime...
import pkg_resources
old_site_dir = ".venv/lib/python3.6/site-packages/"
working_set = pkg_resources.WorkingSet([old_site_dir])
for dist in working_set:
    print(dist.as_requirement())

Bạn có thể ném đầu ra đó vào một requirements.txttệp và có thể có một trang web được xây dựng lại hoạt động, không python3.6cần thời gian chạy.

Lưu ý rằng phương pháp này có thể không hoàn hảo 100%, vì các dự án có thể khai báo các cây phụ thuộc riêng cho python3.6 và python3.7 bằng cách sử dụng các dấu môi trường trong siêu dữ liệu phân phối của chúng (xem PEP 508 ). Nó cũng có thể là mục cài đặt trong trang web 3.6 bạn không hỗ trợ 3,7 ở tất cả . Tuy nhiên, khá hiếm khi thấy rằng trong một phiên bản nhỏ giữa 3.6 và 3.7, vì vậy chỉ cần sử dụng bộ làm việc là "đủ tốt" trong thực tế.


"Đủ tốt" đủ tốt trong trường hợp này. Không có vấn đề trong việc cập nhật mô-đun lẻ ở đây và ở đó sau khi công việc hàng loạt đã được thực hiện.
Antti Haapala
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.