Tại sao thứ tự nhập khẩu lại quan trọng trong tập lệnh xử lý PyQGIS độc lập?


13

Tôi đã gặp một vấn đề kỳ lạ khi chạy các kịch bản xử lý PyQGIS độc lập. Thứ tự nhập trong tập lệnh ảnh hưởng đến việc thực thi bình thường của nó.

Bạn có thể tái tạo vấn đề bằng cách mở bảng điều khiển Python và nhập tập lệnh sau (Tôi sử dụng GNU / Linux, QGIS 2.6.1, xử lý plugin v.2.2.0-2 và Python 2.7.3):

# Prepare the environment
import sys
from qgis.core import QgsApplication
from PyQt4.QtGui import QApplication
app = QApplication([])
QgsApplication.setPrefixPath("/usr", True)
QgsApplication.initQgis()

# Prepare processing framework 
sys.path.append('/home/YOUR_USER/.qgis2/python/plugins')
from processing.core.Processing import Processing
Processing.initialize()

print Processing.getAlgorithm("qgis:creategrid")

# Exit applications
QgsApplication.exitQgis()
QApplication.exit()

Bạn nên lấy:

ALGORITHM: Create grid
    HSPACING <ParameterNumber>
    VSPACING <ParameterNumber>
    WIDTH <ParameterNumber>
    HEIGHT <ParameterNumber>
    CENTERX <ParameterNumber>
    CENTERY <ParameterNumber>
    GRIDTYPE <ParameterSelection>
    CRS <ParameterCrs>
    SAVENAME <OutputVector>

Mặt khác, nếu bạn chuyển đổi thứ tự nhập (dòng 3 và 4), theo cách này:

from PyQt4.QtGui import QApplication
from qgis.core import QgsApplication

tập lệnh bây giờ trả về ... None, vì không tìm thấy thuật toán.

Vấn đề này ngụ ý rằng bạn không thể chạy các thuật toán xử lý ra khỏi QGIS nếu bạn (tình cờ) viết nhập theo thứ tự sai.

Tôi đã kiểm tra trong StackOverflow nhưng theo vấn đề thứ tự nhập Python , thứ tự không thực sự quan trọng. Hơn nữa, Hướng dẫn Kiểu cho Mã Python trước tiên cho chúng tôi nhập thư viện chuẩn (chung chung hơn), sau đó là thư viện của bên thứ ba có liên quan và cuối cùng là nhập cụ thể cho ứng dụng cục bộ. Tôi nghĩ PyQt4 nằm trong danh mục nhập khẩu thứ 2, trong khi PyQGIS sẽ là ứng dụng cụ thể của địa phương, do đó, nhập khẩu PyQt4 nên được ưu tiên (mặc dù tôi không phải là chuyên gia về vấn đề này).

Bạn có biết tại sao điều này có thể xảy ra không? Bạn đã bao giờ trải nghiệm một cái gì đó tương tự?


EDIT 1: Thay đổi nhập khẩu ngầm định ( from abc import *) bằng các nhập khẩu rõ ràng (ví dụ from abc import xyz:) theo đề xuất của @ mike-t.


2
Chỉ muốn nói, câu hỏi tuyệt vời với một ví dụ tái sản xuất ngắn và bằng chứng về nghiên cứu và phân tích của nghiên cứu đó.
dùng2856

Câu trả lời:


14

tl; dr

import qgis
import PyQt4
etc

là cách chính xác

Phiên bản dài

Có, lệnh nhập có thể quan trọng và trong trường hợp của QGIS 2.0 trở lên thì có vấn đề.

Bạn phải luôn luôn nhập qgis.corehoặc qgis.gui, thậm chí chỉ import qgislà đủ, trước khi bạn nhập bất kỳ nội dung PyQt nào.

Điều đó có vẻ ngớ ngẩn. Tại sao?

Trong QGIS 2.0, chúng tôi đã chuyển sang sử dụng các ràng buộc SIP phiên bản 2, điều này khiến API gọi nhiều Python hơn, ví dụ như nó sẽ tự động chuyển đổi các loại cho bạn:

1.0 SIP bạn phải làm:

value.toString()

trong 2.0

value

sẽ chỉ hoạt động nếu đó là một kiểu chuỗi trong mã C ++.

Được rồi cái gì

Yếu tố quyết định là chúng ta phải đặt phiên bản API thành 2 trong mã trước khi nó được đặt thứ khác của tôi, bạn không thể thiết lập lại một lần nữa khi nó được đặt. Nếu bạn nhập PyQt trước, nó sẽ đặt giá trị thành v1 nhưng mọi thứ trong QGIS hiện sử dụng v2. Để khắc phục điều này, chúng tôi đặt nó thành v2 qgis.__init__.pynhưng chúng tôi phải nhập qgistrước nếu không PyQt thắng.

Bởi vì tất cả các plugin trong QGIS 2.0 trở lên hiện nay đều sử dụng SIP v2, mọi cuộc gọi như SIP v1 sẽ gây ra lỗi khi chạy.


1
Cảm ơn bạn, tôi đã không nhận thức được ý nghĩa như vậy. Tôi tự hỏi nếu vấn đề này được ghi nhận tốt cho các nhà phát triển PyQGIS. Chẳng hạn, điều này cho thấy một plugin sẽ trông như thế nào và không đề cập bất cứ điều gì về nhập khẩu. Tôi đoán rằng vấn đề này không ảnh hưởng đến các plugin giống như cách nó ảnh hưởng đến các ứng dụng / tập lệnh độc lập. (Tôi sẽ đưa ra câu trả lời của bạn trong vài phút, tôi đã dành tất cả các phiếu bầu hàng ngày rồi :)).
Germán Carrillo

Có, nó không ảnh hưởng đến plugin vì chúng tôi nhập qgis trong c ++ trước PyQt.
Nathan W

Lạ thật ... Tôi nhận được một "ImportError: Không có mô-đun có tên PyQt" khi sử dụng import PyQtmặc dù import qgishoạt động. Không phải là nó làm phiền tôi đến mức tôi cần phải hỏi một câu hỏi mới, chỉ là tự hỏi nếu bạn biết tại sao điều này là. Tôi sử dụng Windows 7 với cùng phiên bản xử lý / python như @gcarrillo.
Joseph

Đó là một lỗi đánh máy của tôi. Xem chỉnh sửa.
Nathan W
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.