Phát triển một plugin phụ thuộc vào thư viện Python bên ngoài


29

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:

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)

Quy trình này chỉ dành cho Windows vì Hệ điều hành Unix (Linux, Mac OS X) sử dụng phiên bản Python chuẩn được cài đặt
gen

Tôi biết điều đó, tôi đã 'làm phong phú' câu hỏi của mình, bây giờ có phần người dùng OS X giải thích cách thực hiện trên máy mac.
Kỹ sư-G

1
Bạn hoàn toàn có thể cài đặt pip trong Apple Python. QGIS sử dụng phiên bản này chứ không phải các phiên bản khác (Homebrew, Anaconda và các phiên bản khác). Nếu bạn muốn sử dụng Python Homebrew, bạn cần cài đặt phiên bản Homebrew của QGIS
gen


3
Nếu đó là thư viện python thuần, bạn có thể phân phối thư viện bên thứ 3 với plugin dưới dạng gói / mô-đun.
dùng2856

Câu trả lời:


2

Tôi đã chịu sự cố này để chạy các tập lệnh Python trong QGIS, điều này phụ thuộc vào thư viện Python bên ngoài. Giải pháp đơn giản nhất là cài đặt Boundless Desktop đi kèm với dòng lệnh và cài đặt python của riêng nó. Sử dụng dòng lệnh bạn có thể chạy và cài đặt (sử dụng pip) bất kỳ gói python bên ngoài nào.


1

Tôi đã làm việc này một chút về một dự án gần đây. Thật không may, thực sự không phải là một cách tuyệt vời để đạt được điều này. Giải pháp của bạn rất giống với những gì tôi nghĩ ra, nhưng không có gì đảm bảo người dùng thậm chí đã cài đặt pip.

Tôi đã kết thúc bao gồm một bản sao get_pip.py và sử dụng execfile () để chạy nó trong trường hợp khi nó không có sẵn.

Tương tự như giải pháp cuối cùng của bạn:

self.plugin_dir = os.path.dirname(__file__)

try:
    import pip
except:
    execfile(os.path.join(self.plugin_dir, get_pip.py))
    import pip
    # just in case the included version is old
    pip.main(['install','--upgrade','pip'])

try:
    import somelibrary
except:
    pip.main(['install', 'somelibrary'])

Tất nhiên, một sự thay thế sẽ là bao gồm chính thư viện trong thư mục của plugin của bạn. Bạn có nguy cơ cung cấp một phiên bản cũ, nhưng về mặt lý thuyết thì nó không thành vấn đề.



1

Điều này làm việc cho tôi (trong def run (tự)):

    def load_libraries(self):
        import_path = os.path.join(self.plugin_dir, 'lib/python2.7/site-packages')
        sys.path.insert(0, import_path)

và thiết lập một virtualenv.

Với Windows dường như là một câu chuyện khác. Tôi gặp sự cố khi cài đặt matplotlib.

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.