Cài đặt nhiều phiên bản của một gói với pip


83

Trong ứng dụng của tôi, tôi muốn sử dụng:

  • packageA, yêu cầu packageX==1.3
  • packageB, yêu cầu packageX==1.4
  • packageX==1.5

Làm cách nào để cài đặt nhiều phiên bản packageXvới pip để xử lý tình huống này?


2
cài đặt các gói đến các vị trí không chuẩn, sau đó sử dụng PYTHONPATH để xác định cái nào cần nhập; xem câu trả lời này
Yibo Yang

1
Lưu ý nhỏ rằng, kịch bản trong câu hỏi này và giải pháp hacky trong câu trả lời hiện đang được chấp nhận là một ví dụ điển hình về lý do tại sao chủ sở hữu gói không nên và không được cầu kỳ để ghim một phiên bản phụ thuộc chính xác của họ. Đáng lẽ họ phải sử dụng packageX>=1.3,<2packageX>=1.4,<2(giả sử gói ngược dòng đang tuân theo Phiên bản ngữ nghĩa ), thì bạn với tư cách là nhà phát triển ứng dụng phía dưới sẽ không gặp vấn đề gì khi ghim và sử dụng packageX==1.5và mọi người sẽ rất vui. Thêm chi tiết ở đây
RayLuo

Câu trả lời:


63

pip sẽ không giúp bạn điều này.

Bạn có thể yêu cầu nó cài đặt một phiên bản cụ thể, nhưng nó sẽ ghi đè phiên bản khác. Mặt khác, sử dụng hai Virtualenv sẽ cho phép bạn cài đặt cả hai phiên bản trên cùng một máy, nhưng không thể sử dụng chúng cùng một lúc.

Tốt nhất bạn nên cài đặt cả hai phiên bản theo cách thủ công, bằng cách đặt chúng vào đường dẫn Python của bạn với một tên khác.

Nhưng nếu hai lib của bạn mong muốn chúng có cùng tên (và họ nên làm như vậy), bạn sẽ phải sửa đổi chúng để chúng chọn phiên bản chúng cần với một số bí danh nhập như:

import dependencyname_version as dependencyname

Hiện tại không có cách nào rõ ràng để làm điều này. Điều tốt nhất bạn có thể hy vọng là để bản hack này hoạt động.

Tôi thà bỏ một trong hai lib và thay thế nó bằng một lib tương đương, hoặc vá nó để chấp nhận phiên bản phụ thuộc mới và trả lại bản vá cho cộng đồng.


41
Vẫn không có giải pháp cho điều này?
Håken Nắp

2
Vẫn không có giải pháp?
AjaxLeung

1
Rất nhiều ngôn ngữ gặp sự cố này ... Java, Go, Haxe ... hy vọng các nhà thiết kế ngôn ngữ sẽ từ bỏ các không gian tên gói toàn cầu và áp dụng một hệ thống mô-đun giống Node.js hơn trong các ngôn ngữ mà họ tạo ra trong tương lai, vì Node.js hỗ trợ nhiều phiên bản của sự phụ thuộc.
Andy

15

Tải về nguồn cho ea. gói hàng. Cài đặt từng thứ trên thư mục riêng biệt của riêng nó. Ví dụ. Tôi đã có gói phiên bản 1.10, nhưng muốn chuyển sang phiên bản dev cho một số công việc. Tôi đã tải về mã nguồn cho các mô-đun dev: git clone https://github.com/networkx/networkx.git cd netwokrx Tôi tạo ra một thư mục cho phiên bản này: mkdir /home/username/opt/python, sau đó tôi đặt PYTHONPATH env var: export PYTHONPATH=/home/username/opt/python/lib/python2.7/site-packages/. Tiếp theo, tôi đã cài đặt nó bằng cách sử dụng:python setup.py install --prefix=/home/username/opt/python

Bây giờ, vì PYTHONPATH của tôi hiện đang trỏ đến thư mục gói trang khác này, nên khi tôi chạy python trên dòng lệnh và nhập mô-đun mới, nó sẽ hoạt động. Để chuyển đổi lại, hãy xóa thư mục mới khỏi PYTHONPATH.

>>> import networkx as nx
>>> nx.__version__
'2.0.dev_20151209221101'

2
Hah, đến đây đặc biệt vì tôi đang chiến đấu với networkxsự khác biệt về phiên bản!
dwanderson

"Để chuyển đổi chuyển đổi trở lại, loại bỏ các thư mục mới từ PYTHONPATH.", Phần này không làm việc cho tôi ngay cả sau khi loại bỏ các đường dẫn thư mục mới từsys.path
Avinash Raj
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.