ทำไมลำดับการนำเข้ามีความสำคัญในสคริปต์ประมวลผล PyQGIS แบบสแตนด์อโลน


13

ฉันเจอปัญหาแปลก ๆ ในขณะที่เรียกใช้สคริปต์ประมวลผล 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 แล้ว แต่ตามPython นำเข้าเรื่องการสั่งซื้อการสั่งซื้อไม่ควรสำคัญจริงๆ ยิ่งไปกว่านั้นStyle Guide for Python Codeบอกให้เรานำเข้าไลบรารี่มาตรฐาน (ทั่วไปมากกว่า) ก่อนจากนั้นจึงทำการไลบรารี่ของบุคคลที่สามและสุดท้ายคือการนำเข้าเฉพาะแอพพลิเคชั่นในท้องถิ่น ฉันคิดว่า PyQt4 อยู่ในประเภทที่ 2 ของการนำเข้าในขณะที่ PyQGIS จะเป็นแอปพลิเคชันเฉพาะในท้องถิ่นดังนั้นการนำเข้า PyQt4 ควรมาก่อน (ฉันไม่ใช่ผู้เชี่ยวชาญในเรื่องนี้)

คุณมีความคิดว่าทำไมสิ่งนี้ถึงเกิดขึ้นได้หรือไม่? คุณเคยเจออะไรที่คล้ายกันบ้างไหม?


แก้ไข 1: เปลี่ยนการนำเข้าโดยนัย ( from abc import *) โดยรายการที่ชัดเจน (เช่นfrom abc import xyz) ตามที่แนะนำโดย @ mike-t


2
แค่อยากจะบอกว่าคำถามที่ยอดเยี่ยมพร้อมตัวอย่างที่ทำซ้ำได้สั้น ๆ และหลักฐานของการวิจัยและการวิเคราะห์ของการวิจัยนั้น
2856

คำตอบ:


14

TL; DR

import qgis
import PyQt4
etc

เป็นวิธีที่ถูกต้อง

รุ่นยาว

ใช่คำสั่งนำเข้าอาจมีความสำคัญและในกรณีของ QGIS 2.0 ขึ้นไปมันมีความสำคัญ

คุณควรนำเข้าqgis.coreหรือqgis.guiแม้กระทั่งimport qgisเพียงพอก่อนที่จะนำเข้าสิ่งต่างๆของ PyQt

ดูเหมือนว่าโง่ ทำไม?

ใน QGIS 2.0 เราเปลี่ยนไปใช้การผูก SIP รุ่นที่ 2 ซึ่งทำให้ API เรียก Python มากกว่าเช่นมันจะแปลงชนิดให้คุณโดยอัตโนมัติ:

1.0 SIP ที่คุณต้องทำ:

value.toString()

ใน 2.0

value

จะทำงานหากเป็นประเภทสตริงในรหัส C ++

ตกลงอะไร

นักเตะคือเราต้องตั้งค่า API เวอร์ชันเป็น 2 ก่อนที่มันจะได้รับการตั้งค่าของฉันอย่างอื่นคุณไม่สามารถตั้งค่าอีกครั้งเมื่อมีการตั้งค่า หากคุณนำเข้า PyQt ก่อนมันจะตั้งค่าเป็น v1 แต่ตอนนี้ทุกอย่างใน QGIS ใช้ v2 ในการแก้ไขปัญหานี้เราได้ตั้งค่าเป็น v2 qgis.__init__.pyแต่เราต้องนำเข้าqgisก่อนหรืออย่างอื่น PyQt ชนะ

เนื่องจากปลั๊กอินทั้งหมดใน QGIS 2.0 ขึ้นไปตอนนี้ใช้ SIP v2 SIP v1 ใด ๆ เช่นการโทรจะสร้างข้อผิดพลาดเมื่อทำงาน


1
ขอบคุณนาธานฉันไม่ได้ตระหนักถึงความหมายดังกล่าว ฉันสงสัยว่าปัญหานี้ได้รับการบันทึกไว้เป็นอย่างดีสำหรับนักพัฒนา PyQGIS หรือไม่ ตัวอย่างเช่นสิ่งนี้แสดงให้เห็นว่าปลั๊กอินควรมีลักษณะอย่างไรและไม่พูดถึงสิ่งใดเกี่ยวกับการนำเข้า ฉันเดาว่าปัญหานี้จะไม่ส่งผลกระทบต่อปลั๊กอินในลักษณะเดียวกับที่มีผลกับแอปพลิเคชัน / สคริปต์แบบสแตนด์อโลน (ฉันจะโหวตคำตอบของคุณในไม่กี่นาทีฉันใช้เวลาไปกับการโหวตทุกวันแล้ว :))
Germán Carrillo

ใช่มันไม่มีผลกับปลั๊กอินเพราะเรานำเข้า qgis ใน c ++ ก่อน PyQt
Nathan W

แปลก ... ฉันได้รับ "ImportError: ไม่มีโมดูลชื่อ PyQt" เมื่อใช้import PyQtแม้ว่าจะใช้import qgisงานได้ ไม่ใช่ว่ามันทำให้ฉันรำคาญใจจนถึงจุดที่ฉันต้องถามคำถามใหม่ก็แค่สงสัยว่าคุณรู้หรือไม่ว่าทำไมถึงเป็นเช่นนั้น ฉันใช้ Windows 7 ด้วยรุ่นการประมวลผล / หลามแบบเดียวกับ @gcarrillo
Joseph

นั่นเป็นตัวพิมพ์ผิดโดยฉัน ดูการแก้ไข
นาธาน W
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.