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.