Làm cách nào để chạy tập lệnh python đơn giản cho QGIS từ bên ngoài (ví dụ: Sublime Text)?


37

Tôi muốn chạy một vài tập lệnh python nhỏ và đơn giản cho QGIS (Mac) từ "bên ngoài" của QGIS. Với bên ngoài tôi có nghĩa là trong bối cảnh này, dòng lệnh os bình thường (terminal.app) hoặc thậm chí tốt hơn, trực tiếp ra khỏi Sublime Text (trình soạn thảo văn bản), nhưng chắc chắn không thông qua bảng điều khiển python của QGIS.

Tôi đã đọc qua các hướng dẫn khác nhau, ví dụ: http://www.qgis.org/pyqgis-cookbook/intro.html#python-appluggest và tôi có thể có được một tài liệu tham khảo cho ứng dụng QGIS, nhưng tiếc là không qgis.utils.ifacehoặc sâu hơn . Đoạn mã nhỏ này chẳng hạn sẽ in ra tên của lớp đang hoạt động ... đây là những gì tôi có:

    import sys
    sys.path.append("/Applications/QGIS.app/Contents/Resources/python")

    from qgis.core import *
    import qgis.utils

    print "helo" # console output: helo

    QgsApplication.setPrefixPath("/Applications/QGIS.app/", True)
    QgsApplication.initQgis()

    print QgsApplication # console output: <class 'qgis.core.QgsApplication'>

    print qgis.utils.iface # = console output: none

    aLayer = qgis.utils.iface.activeLayer()
    print aLayer.name()

    QgsApplication.exitQgis()

Vui lòng không trả lời tôi ngay bây giờ về cách tạo plugin hoặc thứ gì đó "nặng". Tôi chỉ tìm kiếm một cách nhanh chóng một cách dễ dàng để bắn các tập lệnh ra khỏi trình soạn thảo văn bản thoải mái cho QGIS.

Câu trả lời:


32

Bạn không thể có được một tham chiếu đến ifaceđối tượng ở đây vì nó không tồn tại trong bối cảnh này. Các iface( QgisInterface) đối tượng là một đối tượng thuận tiện cho plugin, hoặc các script chạy bên trong QGIS, để truy cập các đối tượng chính ví dụ như bản đồ vải, truyền thuyết, nhà soạn nhạc, vv, và chỉ tồn tại khi các ứng dụng chính đang chạy.

Khi bạn tạo một tập lệnh Python độc lập bằng API QGIS, không có nội dung nào trong số này tồn tại bởi vì bạn đang tạo ứng dụng bản đồ của riêng mình.

Có ba tình huống khác nhau:

  1. Một plugin QGIS
  2. Một tập lệnh chạy bên trong QGIS (không phải plugin) để tự động hóa
  3. Ứng dụng độc lập sử dụng API QGIS

1.2.có quyền truy cập iface, cái cuối cùng không.

3nếu bạn muốn tạo một tập lệnh mở một lớp trong khung vẽ bản đồ, bạn sẽ thực hiện việc này sauQgsApplication.initQgis()

map = QgsMapCanavs()
layer = QgsVectoryLayer('path.shp','myshapefile','ogr')
map.setLayerSet([layer])

Tuy nhiên nếu bạn thực sự đang tìm kiếm một cái gì đó như thế 2thì bạn chỉ có thể viết cái này trong trình soạn thảo kịch bản của bạn

from qgis.core import *
from qgis.gui import *
import qgis.utils

qgis.utils.iface.activeLayer()

nhưng điều này phải được chạy trong QGIS qgis.utilsđể hoạt động. Điều đó có thể được thực hiện bằng cách đưa tập lệnh vào PATHvà chạy import scriptnametrong bảng điều khiển Python hoặc bằng cách sử dụng plugin ScriptRunner.

Lưu ý những điều sau đây chưa phải là QGIS

Có một số 4chưa được thêm vào và hy vọng sẽ có trong tương lai và đó là tùy chọn để chạy QGIS với một dòng lệnh arg để nói chạy mã này.

Ví dụ:

qgis --code=mycodefile.py

Ghi nhật ký plugin (phiên bản 1.8)

Bạn có thể sử dụng lớp QssMessageLog để ghi thông tin vào cửa sổ nhật ký QGIS. Dấu chấm than màu vàng ở góc dưới bên phải.

from qgis.core import *
log = lambda m: QgsMessageLog.logMessage(m,'My Plugin') 
log('My message')

hoặc không sử dụng lambda

QgsMessageLog.logMessage('My message', 'My Plugin')

Tôi thích lambda dựa trên một vì nó ngắn hơn và ít gõ bất cứ lúc nào bạn muốn đăng nhập một cái gì đó.


Cảm ơn bạn đã làm rõ và trả lời nhanh chóng! sau đó tôi đang chờ đợi tuyệt vọng cho lựa chọn 4. Trong khi đó tôi phải sống cùng 2, đó thực sự là một nỗi đau suốt thời gian import scripttiếp theo reload(script)và dĩ nhiên thay đổi từ biên tập viên của tôi sang QGIS. Tôi cũng đã kiểm tra plugin scriptrunner, điều này đầy hứa hẹn nhưng sau đó tôi không thể truy cập được print "debug value"vào bảng điều khiển QGIS. Bạn có biết, bằng mọi cách, làm thế nào để có một tập lệnh scriptslner in một cái gì đó lên bảng điều khiển QGIS không? Cảm ơn nhiều! Sẽ chờ câu trả lời của bạn và sau đó đóng câu hỏi!
Benedikt Groß

Bảng điều khiển python không thực sự có ý nghĩa cho loại đầu ra đó, nhiều hơn chỉ cho đầu vào. Những gì bạn có thể làm là đăng nhập vào cửa sổ nhật ký QGIS. Sẽ thêm vào câu trả lời để giải thích điều này.
Nathan W

cảm ơn! điều đó cực kỳ hữu ích cách giải quyết của tôi là lạm dụng một cửa sổ bật lên để có đầu ra gỡ lỗidef info(text): QMessageBox.information(None,"Debug Info", str(text))
Benedikt Groß

lỗi đánh máy:QgsVector_y_Layer
Nick Volynkin

14

Tôi nghĩ rằng câu trả lời của Nathan W đã lỗi thời. Tôi đã có thể chạy các kịch bản python của QGIS (phiên bản 2.6) từ dòng lệnh (tùy chọn 4 của Nathan) bằng các lệnh sau.

man qgis
qgis -nologo --project /path/foo.qgs --code /path/foo.py

Điều này hoạt động nhưng chỉ sau khi tôi đóng cửa sổ "mẹo" ... có cách nào để vô hiệu hóa giao diện hoàn toàn và chỉ thực thi --codetập lệnh python không?
Anthony O.

5

Cập nhật cho tùy chọn 4 của Nathan: (Windows, QGIS 2.18 Las Palmas)

Để in tài liệu trợ giúp của QGIS,

qgis - giúp đỡ

Để mở QGIS, tải một dự án, sau đó, chạy một kịch bản python.

qgis --nologo - dự án c: /path/to/projfile.qss --code c: /path/to/code.py

Các lệnh này sẽ chạy trên OSGeo4W Shell mà không gặp vấn đề gì.


1
Câu trả lời của tôi vẫn còn hiệu lực đối với QGIS 3.8 (Zanzibar).
swatchai
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.