QGIS 2.16:カスタムアプリケーションでQGISの外部で実行すると、processing.runalgが失敗する


8

RQGISパッケージを開発しています。R内からQGISを実行するには、コマンドラインからQGISを呼び出します。これはQGIS 2.14で完全に機能しました。ただし、QGIS 2.16で同じコードを実行すると、エラーが発生します。これが私がすることです:

まず、コマンドプロンプトで必要なすべてのパスを設定します。

@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

続いて、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")

これは機能します。ただし、processing.runalgを呼び出しています...

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,)

...このエラーメッセージが表示されます。

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'

回答:


5

1
ビクター、問題は修正されたとおっしゃいましたが、まだ生きています。最近、QGIS 2.18がリリースされました。しかし、カスタムアプリケーションでQGISを使用alg.execute(progress)するにalg.execute(progress or SilentProgress())は、AlgorithmExecutor.py で手動で置き換える必要があります。エラーメッセージが表示されなくなったため、問題はさらに悪化しています。代わりに、成功メッセージさえあります(たとえば、実行中saga:catchmentarearecursive)、指定された出力フォルダーのみが空のままです。その問題を修正していただければ幸いです。それとも何か不足していますか?
Jannes、2016年

5

バリー、アドバイスありがとうございます。どうやら、QGISコアチームはコードを変更しました。QGIS 2.14ではrunalg、次のように定義されています。

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

したがって、進行状況がNone(私のサンプルコードの場合)と等しい場合は、SilentProgressそれを処理しました。対照的に、QGIS 2.16では、対応するifステートメントが削除されました(上記のBarryの回答を参照)。これにより、が失敗しrunalgます。1つの解決策は、不足している行を再度追加して、AlgorithmExecutor.pyスクリプトを手動で編集することです。この場合、スクリプトの先頭に別のインポート行を追加する必要があります(from processing.core.SilentProgress import SilentProgress)。

また、これらの行を削除する特別な理由があるかどうかをQGISコアチームに尋ねます。少しの幸運で、彼らは再びそれらを追加します...


上記の2行とimportステートメントをAlgorithmExecutor.pyスクリプトに追加するとうまくいきました!私は先週2.16にアップグレードしたばかりで、これにも夢中になりました。ありがとう!
rickD 2016

2.8.2から2.16.3にアップグレードしたところ、実行したいくつかの外部pythonスクリプトで同じ問題が発生しました。上記の変更を行うと、問題が解決しました。JannesとSpacedmanに感謝します。
BStone 2016

4

元のエラーのこの最後のビット:

  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'

はと言ってprogressいるNoneため、progress.error呼び出しは失敗します。次に、QGISエラーハンドラーが存在しないifaceオブジェクトにメッセージを書き込もうとするため、表示されたエラーの最初の部分がトリガーされます。

元のエラーを生成する、Processingのpythonコードの関連ビットは次のとおりです。

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

そのため、何らかの理由でアルゴリズムがGeoAlgorithmExecutionExceptionを発生させ、progressNoneになります。どこprogressから来るのかわからない-多分あなたのpythonスクリプトはそれに渡すものを作成するべきです。GeoAlgエラーが発生することも、2つの問題のどちらが本当に修正する必要があるのか​​わかりません...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.