スタンドアロンのPyQGIS処理スクリプトの実行中に奇妙な問題に遭遇しました。スクリプト内のインポートの順序は、通常の実行に影響します。
Pythonコンソールを開いて次のスクリプトを入力することで問題を再現できます(GNU / Linux、QGIS 2.6.1、処理プラグインv.2.2.0-2、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()
以下を入手する必要があります。
ALGORITHM: Create grid
HSPACING <ParameterNumber>
VSPACING <ParameterNumber>
WIDTH <ParameterNumber>
HEIGHT <ParameterNumber>
CENTERX <ParameterNumber>
CENTERY <ParameterNumber>
GRIDTYPE <ParameterSelection>
CRS <ParameterCrs>
SAVENAME <OutputVector>
一方、インポートの順序(行3と4)を切り替えると、次のようになります。
from PyQt4.QtGui import QApplication
from qgis.core import QgsApplication
None
アルゴリズムが見つからなかったため、スクリプトは...を返します。
この問題は、誤ってインポートを間違った順序で記述した場合、QGISから処理アルゴリズムを実行できないことを意味します。
StackOverflowでチェックしましたが、Does Python import order matterに従って、順序は実際には重要ではありません。さらに、Pythonコードのスタイルガイドでは、最初に標準(より一般的な)ライブラリをインポートし、次に関連するサードパーティライブラリをインポートし、最後にローカルアプリケーション固有のインポートを行うように指示しています。PyQt4はインポートの2番目のカテゴリにあると思いますが、PyQGISはローカルアプリケーション固有であるため、PyQt4のインポートを最初に行う必要があります(ただし、私はこれについての専門家ではありません)。
これがなぜ起こるのか、あなたは考えていますか?同様のことを経験したことがありますか?
編集1:@ mike-tが示唆するようにfrom abc import *
、明示的なインポート(例えば)によって暗黙的なインポート()を変更しましたfrom abc import xyz
。