Tôi đang phát triển một plugin Python, mục tiêu đang tích hợp vào QGIS các chức năng của thư viện Python PyPI có tên là 'độ cao'.
Có cách nào độc lập với hệ điều hành để cài đặt các thư viện Python bên ngoài và làm cho chúng có sẵn cho các plugin Python không?
Tôi đã biết các quy trình cụ thể khác nhau của hệ thống để cài đặt một phụ thuộc Python bên ngoài, điều tôi muốn làm là phân phối plugin của mình trên các môi trường khác nhau mà không khiến mọi người phát điên.
Những gì tôi đã biết
Tìm kiếm trên web và các câu hỏi tương tự khác có vẻ như không có giải pháp độc lập cho hệ điều hành.
Người dùng Windows
Python được đóng gói và phân phối bên trong gói QGIS, vì vậy để cài đặt các thư viện Python bên ngoài, bạn phải đi qua OSGeo4W Shell và sử dụng pip từ đó.
Liên kết liên quan:
- Các mô-đun Python độc lập và Python
- Cài đặt Python setuptools vào OSGeo4W Python
- Làm cách nào để cài đặt thư viện python của bên thứ 3 cho QGIS trên Windows?
Người dùng OS X
Trong trường hợp này, QGIS sử dụng Python tích hợp sẵn được đóng gói sẵn trong OS X và được đặt tại:
/usr/bin/python
Vấn đề ở đây là pip được cài đặt mặc định có một số hạn chế và yêu cầu quá nhiều đặc quyền.
Cách giải quyết nhanh là sử dụng công cụ pha chế tại nhà để cài đặt Python để pip của bạn có thể chạy với khung Python có thể sửa đổi người dùng. Xem chi tiết về phương pháp này tại đây .
Sau khi cài đặt tất cả các thư viện Python qua pip, bạn chỉ cần thêm các thư mục của chúng vào biến PATH.
Cách khác cho người dùng OS X
Bên trong plugin Python code, bạn có thể sử dụng pip do hệ thống cung cấp để cài đặt các gói cần thiết. Sau đó, bạn có thể làm cho gói vừa cài đặt có thể truy cập được thêm nó vào đường dẫn.
import sys
import pip
pip.main(['install','--target=/Devel/test', 'elevation'])
sys.path.append("/Devel/test")
Giải pháp tự chế nhưng hoạt động (đã thử nghiệm trên cả Linux và OS X)
Tôi quyết định đi theo cách khác vì nó cho phép tách biệt cập nhật và bảo trì thư viện khỏi plugin. Mỗi khi người dùng mới cài đặt plugin, phiên bản mới nhất của thư viện độ cao sẽ được tải xuống và cài đặt trực tiếp bởi pip bên trong thư mục con của plugin.
self.plugin_dir = os.path.dirname(__file__)
self.elevation_dir = os.path.join(self.plugin_dir, 'elevation')
# Checking the presence of elevation library
try:
import elevation
except:
pip.main(['install', '--target=%s' % self.elevation_dir, 'elevation'])
if self.elevation_dir not in sys.path:
sys.path.append(self.elevation_dir)