Lỗi nhập cho qgis.core khi chạy tập lệnh shell OSGeo4w


17

Tôi đã cố gắng, cùng với bài đăng này , để chạy một tập lệnh trong OSGeo4w Shell , bên ngoài QGIS. Nhưng tôi nhận được lỗi sau:

ImportError: Không có mô-đun có tên qgis.core

Tôi cũng đã đọc các bài viết sau và cố gắng nhập các mô-đun khác nhau nhưng không có kết quả:

Đây là một tập lệnh đơn giản tạo ra một lưới và cắt một hình đa giác trên nó.

Lưu ý: Tập lệnh này đã được thử nghiệm và hoạt động thành công khi chạy trong QGIS.

##Test=name

import os
import glob
import sys

sys.path.append("C:\Program Files\QGIS Brighton\lib;%OSGEO4W_ROOT:\=/%/apps/qgis;%OSGEO4W_ROOT%\apps\qgis\bin;%OSGEO4W_ROOT%\apps\grass\grass-6.4.3\lib;%PATH%")

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *

QgsApplication.setPrefixPath("C:\Program Files\QGIS Brighton\apps\qgis", True)
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"

def run():
#   Set directory, search for all polygon .shp files and run the Create Grid and Clip algorithms then output results into Results folder
    os.chdir(path_dir + "Shapefiles\\")
    for fname in glob.glob("*.shp"):
            outputs_1=processing.runalg("qgis:creategrid", 1000, 1000, 24108, 18351.157175, 258293.802316, 665638.226408, 1, 'EPSG:7405',  None)
            outputs_2=processing.runalg("qgis:clip", outputs_1['SAVENAME'], fname, path_res  + "/"+ fname)
run()

QgsApplication.exitQgis()
#   Remove the above line when running in QGIS

Theo câu trả lời và tập lệnh được đăng bởi @gcarrillo, cuối cùng tôi cũng có thể nhập các qgis.core.mô-đun thành công. Tập lệnh được cung cấp bởi @gcarrillo chạy nhưng tôi gặp lỗi TracBack:

Traceback (most recent call last):
  File "Test.py", line 55, in <module>
    run()
  File "Test.py", line 53, in run
    algClip.processAlgorithm(progress)
  File "C:\Users\username\.qgis2\python\plugins\processing\algs\qgis\ftools\Clip.py", line 59, in processAlgorithm
    layerA.pendingFields(),
AttributeError: 'NoneType' object has no attribute 'pendingFields'

1
Bạn đã đặt PYTHONPATH chính xác chưa? Tôi đề nghị chạy tập lệnh có cùng biến ENV như được đặt trong qgis.bat được chỉ bởi biểu tượng qgis.
Luigi Pirelli

Cảm ơn @LuigiPirelli, tôi sẽ cho đi và báo cáo lại.
Giuse

Cảm ơn đề xuất của bạn @LuigiPirelli nhưng vấn đề vẫn còn tồn tại (trừ khi tôi thêm các biến môi trường không chính xác!)
Joseph

1
Đối với tôi, một cửa sổ PATH phải được đặt với "set" như thế này: set path =% OSGEO4W_ROOT% \ apps \ qgis \ bin;% OSGEO4W_ROOT% \ apps \ grass \ grass-6.4.3 \ lib;% PATH%
Stefan

Câu trả lời:


17

Cuối cùng cũng tìm thấy cách chạy thuật toán xử lý thích hợp trong các tập lệnh độc lập PyQGIS.

Câu trả lời này dựa trên các câu trả lời cho Sự cố khi nhập qgis.core khi viết tập lệnh PyQGIS độc lậpLỗi: Không tìm thấy thuật toán , lần lượt dựa trên cuộc thảo luận về danh sách gửi thư của Qgis-dev .

Tôi khuyên bạn nên tuân theo quy trình công việc được đưa ra trong Sự cố với nhập qgis.core khi viết tập lệnh PyQGIS độc lập để cho phép các thư viện QGIS của bạn trong Shell OSGeo4W. Khi bạn có các thư viện QGIS hoạt động bình thường, chúng tôi có thể chuyển sang phần thứ 2 của câu hỏi của bạn: chạy các thuật toán xử lý trong tập lệnh PyQGIS độc lập.

Tôi đã sửa đổi tập lệnh gốc của bạn một chút và thử nghiệm nó trên Windows 7 và GNU / Linux. Tôi sử dụng phiên bản xử lý 2.2.0-2 và đề nghị bạn sử dụng phiên bản này, đây là phiên bản hiện tại tại thời điểm viết câu trả lời.

import os, sys, glob

# Prepare the environment
from qgis.core import * # qgis.core must be imported before PyQt4.QtGui!!!
from PyQt4.QtGui import *
app = QApplication([])
QgsApplication.setPrefixPath("C:\\Program Files\\QGIS Brighton\\apps\\qgis", True) # The True value is important
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"

# Prepare processing framework 
sys.path.append( home + '\.qgis2\python\plugins' )
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *

def run():
    outputs_1=general.runalg("qgis:creategrid", 1000, 1000, 24108, 18351.157175, 258293.802316, 665638.226408, 1, 'EPSG:7405',  None)
    #   Set directory, search for all polygon .shp files and run the Create Grid and Clip algorithms then output results into Results folder
    os.chdir(path_dir + "Shapefiles\\")
    for fname in glob.glob("*.shp"):        
        outputs_2=general.runalg("qgis:clip", outputs_1['SAVENAME'], fname, path_res  + "/"+ fname)

run()

QgsApplication.exitQgis()
#   Remove the above line when running in QGIS

Lưu ý rằng tôi đã đưa việc tạo lưới ra khỏi vòng lặp for, vì bạn không thực sự cần một lưới mới để thực hiện mỗi clip.

Cái này cần phải dùng mẹo!


Xinh đẹp! Tôi sẽ chấp nhận câu trả lời này vì nó dễ đọc và gọn nhẹ hơn nhiều, theo ý kiến ​​của tôi. Cảm ơn bạn rất nhiều lần nữa bạn thân!
Giuse

Chỉ cần lưu ý rằng tập lệnh này tạo một Processingthư mục trên Bàn làm việc, tương tự như tập lệnh có trong /qgis.2thư mục. Điều này có nên xảy ra không?
Giuse

Nó cũng tạo cùng một thư mục mà nó đọc các shapefiles từ đó và thêm một tệp cơ sở dữ liệu 'qgis' trống. Điều này khá khó chịu vì tập lệnh tôi đang sửa đổi lấy shapefiles từ một số thư mục, điều đó có nghĩa là các tệp / thư mục mới này cũng xuất hiện. Tôi vẫn thích câu trả lời này cho câu hỏi khác của bạn.
Giuse

Phải @Joseph, không biết về việc tạo các thư mục đó, khung xử lý tạo chúng vì bất kỳ lý do gì tôi không hiểu. Tôi đồng ý với bạn, đây là câu trả lời thích hợp, nó tránh cho bạn các bước bổ sung và thực sự tận dụng lợi thế của khung. Cảm ơn tiền thưởng!
Germán Carrillo

2
Điều này rất hữu ích. Điểm yếu lớn của QGIS là cho phép người mới bắt đầu viết các tập lệnh đơn giản. Nó giống như nhổ răng.
Damien

7

Câu trả lời này dựa trên các câu trả lời cho Sự cố khi nhập qgis.core khi viết tập lệnh PyQGIS độc lậpLàm cách nào tôi có thể truy cập ` process` bằng Python? .

Tôi khuyên bạn nên tuân theo quy trình công việc được đưa ra trong Sự cố với nhập qgis.core khi viết tập lệnh PyQGIS độc lập để cho phép các thư viện QGIS của bạn trong Shell OSGeo4W. Khi bạn có các thư viện QGIS hoạt động bình thường, chúng tôi có thể chuyển sang phần thứ 2 của câu hỏi của bạn: chạy các thuật toán xử lý trong tập lệnh PyQGIS độc lập.

Như trong Làm thế nào tôi có thể truy cập `process` với Python? , Tôi sẽ cung cấp cho bạn một cách giải quyết cho đến khi tôi có thể chạy các thuật toán theo tên (ví dụ processing.runalg('provider:algorithm_name'):). Tôi sử dụng phiên bản xử lý 2.2.0-2 và đề nghị bạn sử dụng phiên bản này.

Chúng ta có thể sử dụng bảng điều khiển Python của QGIS để tìm ra vị trí của tập lệnh thuật toán trong việc xử lý các thư mục plugin. Ví dụ: để biết nhập qgis:creategridtừ đâu, hãy viết trong bảng điều khiển Python của Python:

from processing.core.Processing import Processing
Processing.getAlgorithm('qgis:creategrid')

Bạn nên lấy:

<processing.algs.qgis.mmqgisx.MMQGISXAlgorithms.mmqgisx_grid_algorithm instance at 0xae7382c>

đủ để chúng ta chú ý cả đường dẫn mô-đun ( processing.algs.qgis.mmqgisx.MMQGISXAlgorithms) và lớp thuật toán ( mmqgisx_grid_algorithm). Bạn sẽ sử dụng thông tin này trong kịch bản dưới đây.

Tôi đã sửa đổi tập lệnh của bạn một chút và thử nghiệm nó trên Windows 7. Bạn có thể cần điều chỉnh các đường dẫn để chạy tập lệnh trong môi trường của riêng bạn.

import os
import glob
import sys

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *

app = QApplication([])
QgsApplication.setPrefixPath("C:\\Program Files\\QGIS Brighton\\apps\\qgis", True)
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"

# Tell Python where you will get processing from
sys.path.append(home + "\.qgis2\python\plugins")

# Reference the algorithms you want to run
from processing.algs.qgis.mmqgisx.MMQGISXAlgorithms import *
from processing.algs.qgis.ftools.Clip import *
algGrid = mmqgisx_grid_algorithm()
algClip = Clip()

from processing.core.SilentProgress import SilentProgress
progress = SilentProgress()

def run():
    # Create a grid 
    grid = path_dir + "Grids\grid.shp"
    algGrid.setParameterValue('HSPACING', 1000)
    algGrid.setParameterValue('VSPACING', 1000)
    algGrid.setParameterValue('WIDTH', 24108)
    algGrid.setParameterValue('HEIGHT', 18351.157175)
    algGrid.setParameterValue('CENTERX', 258293.802316)
    algGrid.setParameterValue('CENTERY', 665638.226408)
    algGrid.setParameterValue('GRIDTYPE', 1)
    algGrid.setParameterValue('CRS', 'EPSG:7405')
    algGrid.setOutputValue('SAVENAME', grid)
    algGrid.processAlgorithm(progress)

    # Set directory, search for all polygon .shp files 
    os.chdir(path_dir + "Shapefiles\\")    
    for fname in glob.glob("*.shp"):
        # Run the Clip algorithm, then output results into Results folder
        algClip.setParameterValue('INPUT', grid)
        algClip.setParameterValue('OVERLAY', fname)
        algClip.setOutputValue('OUTPUT', path_res  + "/"+ fname)
        algClip.processAlgorithm(progress)

run()
QgsApplication.exitQgis()

Cái này cần phải dùng mẹo!

Như bạn có thể thấy, tôi đã tạo một thư mục Test / Grids để bạn lưu trữ một Shapefile lưới duy nhất thay vì tạo một tệp tạm thời trong mỗi vòng lặp for, điều này dường như không cần thiết.


Rất cám ơn @gcarrillo, tôi sẽ kiểm tra điều này và báo cáo lại.
Giuse

Một lần nữa, cảm ơn bạn đã giúp đỡ của bạn! Tôi có thể nhập thành công mô-đun! Nhưng khi tôi chạy tập lệnh của bạn, tôi nhận được lỗi TracBack. Tôi đã chỉnh sửa câu hỏi để bao gồm điều này.
Giuse

Bạn đã quên tạo thư mục Test/Grids/trước khi chạy tập lệnh.
Germán Carrillo

Xin lỗi, tôi quên đề cập đến điều đó. Tôi đã tạo /Grids/thư mục và tập tin Grid.shp được tạo. Điều đó làm việc hoàn hảo! Một cái gì đó khác là vấn đề.
Giuse

Bạn đã thực hiện bất kỳ thay đổi / điều chỉnh cho kịch bản? Tôi chỉ thử nghiệm nó trên GNU / Linux mà không có vấn đề gì. Lỗi bạn gặp phải là do thuật toán Clip không thể truy cập vào đường dẫn path_dir + "Grids\grid.shp", đó làC:\Users\your_username\Desktop\Test\Grids\grid.shp
Germán Carrillo

4

Tôi đã phải thực hiện một số thay đổi nhỏ đối với tập lệnh do @gcarrillo cung cấp để bao gồm đường dẫn OSGEO4W64 (tôi phải cài đặt lại QGIS thông qua trình cài đặt OSGEO4W64 khi tôi sử dụng trình cài đặt độc lập ban đầu) và bao gồm dấu gạch chéo kép. Đây là kịch bản cuối cùng và cảm ơn tất cả mọi người vì sự giúp đỡ của họ:

import os, sys, glob

# Prepare the environment
from qgis.core import * # qgis.core must be imported before PyQt4.QtGui!!!
from PyQt4.QtGui import *
app = QgsApplication([]) # instantiation of QgsApplication
QgsApplication.setPrefixPath("C:\\OSGeo4W64\\apps\\qgis", True) # The True value is important
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"

# Prepare processing framework 
sys.path.append( home + '\.qgis2\python\plugins' )
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *

def run():
    outputs_1=general.runalg("qgis:creategrid", 1000, 1000, 24108, 18351.157175, 258293.802316, 665638.226408, 1, 'EPSG:7405',  None)
    #   Set directory, search for all polygon .shp files and run the Create Grid and Clip algorithms then output results into Results folder
    os.chdir(path_dir + "Shapefiles\\")
    for fname in glob.glob("*.shp"):        
        outputs_2=general.runalg("qgis:clip", outputs_1['SAVENAME'], fname, path_res  + "/"+ fname)
run()

QgsApplication.exitQgis()
#   Remove the above line when running in QGIS
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.