İthalat sırası, bağımsız bir PyQGIS işleme komut dosyasında neden önemlidir?


13

Bağımsız PyQGIS işleme komut dosyalarını çalıştırırken garip bir sorunla karşılaştım. Koddaki içe aktarma sırası normal yürütülmesini etkiler.

Bir Python konsolu açıp aşağıdaki komut dosyasını girerek sorunu yeniden oluşturabilirsiniz (GNU / Linux, QGIS 2.6.1, v.2.2.0-2 işleme eklentisini ve Python 2.7.3'ü kullanıyorum):

# 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()

Şunları elde etmelisiniz:

ALGORITHM: Create grid
    HSPACING <ParameterNumber>
    VSPACING <ParameterNumber>
    WIDTH <ParameterNumber>
    HEIGHT <ParameterNumber>
    CENTERX <ParameterNumber>
    CENTERY <ParameterNumber>
    GRIDTYPE <ParameterSelection>
    CRS <ParameterCrs>
    SAVENAME <OutputVector>

Öte yandan, ithalat sırasını (satır 3 ve 4) değiştirirseniz, bu şekilde:

from PyQt4.QtGui import QApplication
from qgis.core import QgsApplication

Nonealgoritma bulunamadığı için komut dosyası şimdi ... döndürüyor .

Bu sorun, içe aktarma işlemlerini yanlış sırada yazıyorsanız, QGIS dışında işleme algoritmalarını çalıştıramayacağınız anlamına gelir.

StackOverflow kontrol ettik ama göre Python ithalat sipariş önemli , sipariş gerçekten önemli olmamalı. Dahası, Python Kodu için Stil Kılavuzu bize önce standart (daha genel) kütüphaneleri, daha sonra ilgili üçüncü taraf kütüphanelerini ve son olarak yerel uygulamaya özel ithalatları aktarmamızı söyler. Bence PyQt4 2. ithalat kategorisinde yer alırken, PyQGIS yerel uygulamaya özgü olacaktır, bu yüzden PyQt4 ithalatı önce gelmelidir (Bununla ilgili bir uzman değilim).

Bunun neden olabileceği hakkında bir fikriniz var mı? Hiç benzer bir şey yaşadın mı?


DÜZENLEME 1: Değiştirilmiş örtülü ithalat ( from abc import *açık olanlar (örneğin, ile) from abc import xyz'Mike-t tarafından önerilen).


2
Sadece kısa bir tekrarlanabilir örnekle mükemmel bir soru ve bu araştırmanın araştırma ve analizinin kanıtını söylemek istedim.
user2856

Yanıtlar:


14

tl; Dr.

import qgis
import PyQt4
etc

doğru yol

Uzun versiyon

Evet, ithalat siparişi önemli olabilir ve QGIS 2.0 ve üstü için önemli.

PyQt öğelerini içe aktarmadan önce her zaman içe aktarmanız qgis.coreveya qgis.guihatta import qgisyeterlidir.

Aptalca görünüyor. Neden?

QGIS 2.0'da, API çağrılarını daha fazla Python yapan, örneğin türleri sizin için otomatik olarak dönüştürecek olan SIP'in sürüm 2 bağlantılarını kullanmaya geçtik:

1.0 Yapmanız gereken SIP:

value.toString()

2.0'da

value

sadece C ++ kodunda bir dize türü ise çalışır.

Peki ne olmuş

En önemlisi, başka bir şey ayarlanmadan önce API sürümünü kodda 2 olarak ayarlamamız gerektiğidir, ayarlandıktan sonra tekrar ayarlayamazsınız. Önce PyQt içe aktarırsanız, değer v1 olarak ayarlanır, ancak QGIS'teki her şey şimdi v2 kullanır. Bunu düzeltmek için onu v2 olarak ayarladık, qgis.__init__.pyancak qgisönce PyQt kazançlarını ithal etmeliyiz .

QGIS 2.0 ve üstündeki tüm eklentiler artık SIP v2 kullandığından, SIP v1 benzeri çağrılar çalışırken bir hata üretecektir.


1
Teşekkürler Nathan, bu tür etkilerin farkında değildim. Bu sorunun PyQGIS geliştiricileri için iyi belgelenmiş olup olmadığını merak ediyorum. Örneğin, bu bir eklentinin nasıl görünmesi gerektiğini gösterir ve ithalat hakkında hiçbir şeyden bahsetmez. Bu sorun eklentileri bağımsız uygulamaları / komut dosyalarını etkilediği gibi etkilemez. (Cevabınızı birkaç dakika içinde oylayacağım, tüm günlük oyları zaten harcadım :)).
Germán Carrillo

Evet, eklentileri etkilemez, çünkü Py ++ 'dan önce c ++' da qgis içe aktarırız.
Nathan W

Kullanırken: "PyQT adında bir modül ImportError" Garip ... Ben bir olsun import PyQther ne kadar import qgisişler. Beni yeni bir soru sormam gereken noktaya rahatsız etmediği için, bunun neden olduğunu bilip bilmediğini merak ediyordum. Windows 7'yi @gcarrillo ile aynı işleme / python sürümleriyle kullanıyorum.
Joseph

Bu benim için bir yazım hatası. Bkz. Düzenleme.
Nathan W
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.