2009-04-02 23 views
98

Nhiều mô-đun Python của bên thứ ba có thuộc tính chứa thông tin phiên bản cho mô-đun (thường là một cái gì đó như module.VERSION hoặc module.__version__), tuy nhiên một số thì không.Kiểm tra phiên bản mô-đun Python tại thời gian chạy

Ví dụ cụ thể về các mô-đun như vậy là libxslt và libxml2.

Tôi cần kiểm tra xem phiên bản đúng của các mô-đun này có đang được sử dụng khi chạy không. Có cách nào để làm việc này không?

Một giải pháp tiềm năng sẽ được đọc trong nguồn lúc chạy, băm nó và sau đó so sánh nó với mã băm của phiên bản đã biết, nhưng điều đó thật khó chịu.

Có giải pháp nào tốt hơn không?

Trả lời

7

Tôi sẽ tránh xa băm. Phiên bản libxslt đang được sử dụng có thể chứa một số loại bản vá không ảnh hưởng đến việc bạn sử dụng nó.

Cách khác, tôi muốn đề nghị bạn không kiểm tra tại thời gian chạy (không biết đó có phải là yêu cầu khó hay không). Đối với những thứ python tôi viết có phụ thuộc bên ngoài (thư viện của bên thứ 3), tôi viết một kịch bản mà người dùng có thể chạy để kiểm tra cài đặt python của họ để xem các phiên bản thích hợp của mô-đun có được cài đặt hay không.

Đối với các mô-đun không có thuộc tính 'phiên bản' được xác định, bạn có thể kiểm tra giao diện chứa (lớp và phương pháp) và xem chúng có khớp với giao diện mà chúng mong đợi không. Sau đó, trong mã thực tế mà bạn đang làm việc trên, giả định rằng các mô-đun bên thứ 3 có giao diện mà bạn mong đợi.

7

Một số ý tưởng:

  1. Hãy thử kiểm tra các chức năng mà tồn tại hoặc không tồn tại trong các phiên bản cần thiết của bạn.
  2. Nếu không có sự khác biệt về chức năng, hãy kiểm tra đối số chức năng và chữ ký.
  3. Nếu bạn không thể tìm ra từ chữ ký chức năng, hãy thiết lập một số cuộc gọi sơ khai tại thời điểm nhập và kiểm tra hành vi của chúng.
213

Sử dụng pkg_resources. Bất cứ điều gì được cài đặt từ PyPI ít nhất phải có một số phiên bản.

>>> import pkg_resources 
>>> pkg_resources.get_distribution("blogofile").version 
'0.7.1' 
+8

Cũng lưu ý rằng, tên gói phải là tên của mục nhập PyPI. Vì vậy, một cái gì đó như "pkg_resources.get_distribution ('MySQLdb'). Phiên bản" sẽ không làm việc nhưng "pkg_resources.get_distribution ('mysql-python'). Phiên bản" sẽ. – Rahul

+1

Nếu bạn đang chạy với tên tệp tuyệt đối, 'pkg_resources' có thể chọn một phiên bản khác che khuất phiên bản bạn đang thực sự chạy vì nó có mức ưu tiên cao hơn trên' PYTHONPATH' hoặc tương tự. – tripleee

+3

Trong trường hợp ai đó muốn biết cách tạo thuộc tính '__version__': http://stackoverflow.com/q/17583443/562769 –

2

Bạn có thể sử dụng

pip freeze 

để xem các gói cài đặt trong định dạng yêu cầu.

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