QGIS 2.16: process.runache không thành công khi chạy bên ngoài QGIS trong một ứng dụng tùy chỉnh


8

Tôi đang phát triển gói RQGIS. Để chạy QGIS từ bên trong R, tôi gọi QGIS thông qua dòng lệnh. Điều này đã làm việc hoàn hảo với QGIS 2.14. Tuy nhiên, việc chạy cùng mã với QGIS 2.16 sẽ tạo ra lỗi. Đây là những gì tôi làm:

Đầu tiên, tôi đặt tất cả các đường dẫn cần thiết trong dấu nhắc lệnh:

@echo off
SET OSGEO4W_ROOT=D:\osgeo4w_qgis16
call "%OSGEO4W_ROOT%"\bin\o4w_env.bat
@echo off
path %PATH%;%OSGEO4W_ROOT%\apps\qgis\bin
set PYTHONPATH=%PYTHONPATH%;%OSGEO4W_ROOT%\apps\qgis\python;
set QGIS_PREFIX_PATH=%OSGEO4W_ROOT%\apps\qgis
rem open python     
python.exe

Sau đó, tôi chạy các dòng sau trong Python:

import os
import sys
from qgis.core import *
import qgis.utils
from osgeo import ogr
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.gui import *
QgsApplication.setPrefixPath('D:\osgeo4w_qgis16\apps\qgis', True)
app = QgsApplication([], True)
QgsApplication.initQgis()
sys.path.append(r'D:\osgeo4w_qgis16\apps\qgis\python\plugins')
from processing.core.Processing import Processing
Processing.initialize()
import processing
processing.alglist()
processing.alghelp("grass7:v.voronoi")

Những công việc này. Tuy nhiên, đang gọi xử lý.

from processing.tests.TestData import points
result = processing.runalg('grass7:v.voronoi', points(), False, False, '270778.60198,270855.745301,4458921.97814,4458983.8488', -1, 0.0001, 0, None,)

... Tạo thông báo lỗi này:

Error in sys.excepthook:
Traceback (most recent call last):
  File "D:\osgeo4w_qgis16\apps\qgis\python\qgis\utils.py", line 196, in qgis_excepthook
    showException(type, value, tb, None, messagebar=True)
  File "D:\osgeo4w_qgis16\apps\qgis\python\qgis\utils.py", line 107, in showException
    open_stack_dialog(type, value, tb, msg)
  File "D:\osgeo4w_qgis16\apps\qgis\python\qgis\utils.py", line 142, in open_stack_dialog
    iface.messageBar().popWidget()
AttributeError: 'NoneType' object has no attribute 'messageBar'

Original exception was:
Traceback (most recent call last):
  File "<stdin>", line 10, in <module>
  File "D:\osgeo4w_qgis16\apps\qgis\python\plugins\processing\tools\general.py", line 75, in runalg
    alg = Processing.runAlgorithm(algOrName, None, *args, **kwargs)
  File "D:\osgeo4w_qgis16\apps\qgis\python\plugins\processing\core\Processing.py", line 304, in runAlgorithm
    ret = runalg(alg, progress)
  File "D:\osgeo4w_qgis16\apps\qgis\python\plugins\processing\gui\AlgorithmExecutor.py", line 52, in runalg
    progress.error(e.msg)
AttributeError: 'NoneType' object has no attribute 'error'

Câu trả lời:


5

Lỗi xử lý đã được sửa gần đây, xem https://github.com/qgis/QGIS/commit/df2ca2e60798315d816966f25aa024b93835f776


1
Victor, mặc dù bạn nói rằng vấn đề đã được khắc phục, nó vẫn còn tồn tại. Gần đây, QGIS 2.18 đã được phát hành. Nhưng vẫn còn người ta phải tự thay thế alg.execute(progress)bởi alg.execute(progress or SilentProgress())trong AlgorithmExecutor.py sử dụng QGIS trong một ứng dụng tùy chỉnh. Vấn đề đã trở nên tồi tệ hơn kể từ bây giờ không có thông báo lỗi xảy ra. Thay vào đó, thậm chí có thông báo thành công (ví dụ: khi chạy saga:catchmentarearecursive), chỉ các thư mục đầu ra được chỉ định vẫn trống. Tôi sẽ đánh giá rất cao nếu bạn có thể khắc phục vấn đề đó. Hay tôi đang thiếu một cái gì đó?
Jannes

5

Barry, cảm ơn lời khuyên của bạn. Rõ ràng, nhóm nòng cốt của QGIS đã thay đổi mã. Trong QGIS 2.14 runalgđược định nghĩa như sau:

def runalg(alg, progress=None):
  """Executes a given algorithm, showing its progress in the
  progress object passed along.

  Return true if everything went OK, false if the algorithm
  could not be completed.
  """

  if progress is None:
      progress = SilentProgress()
  try:
      alg.execute(progress)
      return True
  except GeoAlgorithmExecutionException as e:
      ProcessingLog.addToLog(sys.exc_info()[0], ProcessingLog.LOG_ERROR)
      progress.error(e.msg)
      return False

Vì vậy, nếu tiến trình bằng None(đó là trường hợp trong mã ví dụ của tôi), hãy SilentProgressquan tâm đến nó. Ngược lại, trong QGIS 2.16, câu lệnh if tương ứng đã bị xóa (xem câu trả lời của Barry ở trên), dẫn đến sự thất bại của runalg. Một giải pháp sẽ là chỉnh sửa thủ công tập lệnh Al ThuậtmExecutor.py bằng cách thêm lại các dòng bị thiếu. Trong trường hợp này, người ta sẽ phải thêm một dòng nhập khác vào đầu tập lệnh ( from processing.core.SilentProgress import SilentProgress).

Tôi cũng sẽ hỏi nhóm nòng cốt của QGIS nếu có lý do đặc biệt cho việc loại bỏ các dòng này. Với một chút may mắn, họ sẽ thêm chúng lần nữa ...


thêm 2 dòng ở trên và câu lệnh nhập vào tập lệnh Al ThuậtmExecutor.py làm việc cho tôi! Tôi mới nâng cấp lên 2,16 vào tuần trước và cũng bị treo lên vì điều này. Cảm ơn!
rickD

Tôi vừa nâng cấp từ 2.8.2 lên 2.16.3 và gặp phải vấn đề tương tự với một số tập lệnh python bên ngoài mà tôi chạy. Làm những thay đổi trên đã khắc phục vấn đề cho tôi. Cảm ơn Jannes và Spacesman.
BStone

4

Bit cuối cùng của lỗi ban đầu:

  File "D:\osgeo4w_qgis16\apps\qgis\python\plugins\processing\gui\AlgorithmExecutor.py", line 52, in runalg
    progress.error(e.msg)
AttributeError: 'NoneType' object has no attribute 'error'

đang nói rằng progressNone, vì vậy progress.errorcuộc gọi không thành. Điều này sau đó kích hoạt phần đầu tiên của lỗi được hiển thị vì trình xử lý lỗi QGIS cố gắng viết một thông báo đến một đối tượng iface cũng không tồn tại.

Bit có liên quan của mã python của Chế biến tạo ra lỗi ban đầu là:

def runalg(alg, progress=None):
    """Executes a given algorithm, showing its progress in the
    progress object passed along.

    Return true if everything went OK, false if the algorithm
    could not be completed.
    """
    try:
        alg.execute(progress)
        return True
    except GeoAlgorithmExecutionException as e:
        ProcessingLog.addToLog(sys.exc_info()[0], ProcessingLog.LOG_ERROR)
        progress.error(e.msg)  ## this line ##
        return False

Vì vậy, vì một số lý do, thuật toán đã đưa ra một GeoAlacticmExecutException và progresslà Không có. Tôi không biết progressnó có nghĩa là từ đâu - có lẽ kịch bản python của bạn sẽ tạo ra thứ gì đó để truyền cho nó. Tôi cũng không biết lỗi này gây ra lỗi GeoAlg, hoặc một trong hai vấn đề là vấn đề bạn thực sự cần khắc phục ...

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.