使用QGIS模型设计器导出Python脚本后运行无响应问题求助
QGIS模型导出脚本无执行反应的解决方法
问题现象
用QGIS模型构建器导出的Python脚本,在QGIS Python控制台运行时没有任何反应:既不生成输出文件,也不抛出错误,但原模型在构建器内运行完全正常。导出的原始代码如下:
""" Model exported as python. Name : model Group : With QGIS : 32403 """ from qgis.core import QgsProcessing from qgis.core import QgsProcessingAlgorithm from qgis.core import QgsProcessingMultiStepFeedback from qgis.core import QgsProcessingParameterRasterLayer from qgis.core import QgsProcessingParameterRasterDestination import processing class Model(QgsProcessingAlgorithm): def initAlgorithm(self, config=None): self.addParameter(QgsProcessingParameterRasterLayer('rasterinput', 'raster_input', defaultValue=None)) self.addParameter(QgsProcessingParameterRasterDestination('Raster_aspect', 'raster_aspect', createByDefault=True, defaultValue='C:/Users/tlind/AppData/Roaming/QGIS/QGIS3/profiles/default/processing/outputs/raster_aspect_output.tif')) def processAlgorithm(self, parameters, context, model_feedback): # Use a multi-step feedback, so that individual child algorithm progress reports are adjusted for the # overall progress through the model feedback = QgsProcessingMultiStepFeedback(1, model_feedback) results = {} outputs = {} # Aspect alg_params = { 'INPUT': parameters['rasterinput'], 'Z_FACTOR': 1, 'OUTPUT': parameters['Raster_aspect'] } outputs['Aspect'] = processing.run('native:aspect', alg_params, context=context, feedback=feedback, is_child_algorithm=True) results['Raster_aspect'] = outputs['Aspect']['OUTPUT'] return results def name(self): return 'model' def displayName(self): return 'model' def group(self): return '' def groupId(self): return '' def createInstance(self): return Model()
问题原因
导出的脚本仅定义了QgsProcessingAlgorithm子类,没有包含触发算法执行的逻辑。模型构建器导出的代码只是封装了处理流程,需要手动添加调用代码才能在控制台运行。
解决步骤
1. 添加执行代码
在脚本末尾添加以下代码,负责实例化算法、传入参数、执行处理:
if __name__ == '__main__': # 获取当前QGIS项目上下文 context = QgsProcessingContext() # 创建反馈对象用于输出日志 feedback = QgsProcessingFeedback() # 实例化算法 alg = Model() # 初始化算法参数 alg.initAlgorithm() # 定义参数:替换为你的输入栅格路径/图层名,输出路径可修改 params = { 'rasterinput': '你的输入栅格图层名或文件路径', # 例如:'C:/data/dem.tif' 或项目中已加载的图层名称 'Raster_aspect': 'C:/Users/tlind/AppData/Roaming/QGIS/QGIS3/profiles/default/processing/outputs/raster_aspect_output.tif' } # 执行算法 try: results = alg.processAlgorithm(params, context, feedback) print(f"处理完成,输出文件路径:{results['Raster_aspect']}") except Exception as e: print(f"执行出错:{str(e)}")
2. 调整参数注意事项
rasterinput可以填项目中已加载的栅格图层名称,或者直接填栅格文件的绝对路径- 确保输出路径
Raster_aspect所在的文件夹已存在,否则会报错
3. 验证运行
修改参数后,在QGIS Python控制台运行完整脚本,此时会输出处理日志和结果路径,同时生成输出文件。
修改后的完整代码
""" Model exported as python. Name : model Group : With QGIS : 32403 """ from qgis.core import QgsProcessing from qgis.core import QgsProcessingAlgorithm from qgis.core import QgsProcessingMultiStepFeedback from qgis.core import QgsProcessingParameterRasterLayer from qgis.core import QgsProcessingParameterRasterDestination from qgis.core import QgsProcessingContext, QgsProcessingFeedback import processing class Model(QgsProcessingAlgorithm): def initAlgorithm(self, config=None): self.addParameter(QgsProcessingParameterRasterLayer('rasterinput', 'raster_input', defaultValue=None)) self.addParameter(QgsProcessingParameterRasterDestination('Raster_aspect', 'raster_aspect', createByDefault=True, defaultValue='C:/Users/tlind/AppData/Roaming/QGIS/QGIS3/profiles/default/processing/outputs/raster_aspect_output.tif')) def processAlgorithm(self, parameters, context, model_feedback): # Use a multi-step feedback, so that individual child algorithm progress reports are adjusted for the # overall progress through the model feedback = QgsProcessingMultiStepFeedback(1, model_feedback) results = {} outputs = {} # Aspect alg_params = { 'INPUT': parameters['rasterinput'], 'Z_FACTOR': 1, 'OUTPUT': parameters['Raster_aspect'] } outputs['Aspect'] = processing.run('native:aspect', alg_params, context=context, feedback=feedback, is_child_algorithm=True) results['Raster_aspect'] = outputs['Aspect']['OUTPUT'] return results def name(self): return 'model' def displayName(self): return 'model' def group(self): return '' def groupId(self): return '' def createInstance(self): return Model() # 新增的执行逻辑 if __name__ == '__main__': context = QgsProcessingContext() feedback = QgsProcessingFeedback() alg = Model() alg.initAlgorithm() # 替换为实际参数 params = { 'rasterinput': '输入栅格图层名或文件路径', 'Raster_aspect': 'C:/Users/tlind/AppData/Roaming/QGIS/QGIS3/profiles/default/processing/outputs/raster_aspect_output.tif' } try: results = alg.processAlgorithm(params, context, feedback) print(f"处理完成,输出文件:{results['Raster_aspect']}") except Exception as e: print(f"错误信息:{str(e)}")
内容的提问来源于stack exchange,提问作者Tobias Lind
相关产品推荐
相关产品推荐

