问:Python在Batch的脚本结束时停止工作

时间:2018-01-11 19:19:44

标签: python python-2.7 batch-file

我正在通过批处理文件从命令窗口运行一系列python脚本。

以前,它没有问题。但是现在,如果没有代码更改,每次到达脚本结束时,我都会收到“Python.exe已停止工作”错误。脚本实际上已完成处理,但我需要关闭批处理的错误窗口以继续。

我已经尝试将sys.exit添加到脚本的末尾,但这没有任何区别。第一个脚本没有问题,但之后的每个脚本都有这个问题。

如何阻止此错误发生?

批处理文件

C:\Path\to\Python\ArcGIS64bitversion C:\Path\to\Script1
C:\Path\to\Python\ArcGIS64bitversion C:\Path\to\Script2
C:\Path\to\Python\ArcGIS64bitversion C:\Path\to\Script3
C:\Path\to\Python\ArcGIS64bitversion C:\Path\to\Script4a
C:\Path\to\Python\ArcGIS64bitversion C:\Path\to\Script4b
C:\Path\to\Python\ArcGIS64bitversion C:\Path\to\Script4c
C:\Path\to\Python\ArcGIS64bitversion C:\Path\to\Script4d
C:\Path\to\Python\ArcGIS64bitversion C:\Path\to\Script5
C:\Path\to\Python\ArcGIS64bitversion C:\Path\to\Script6

python脚本确实完成了所有操作。脚本2-5都使用多处理,但脚本6不使用多处理,但仍会遇到错误。

常规脚本结构

import statements
global variables
get data statements

Def Code:
    try: 
        code
        sys.exit
    except:
        print error in text file

Def multiprocessing:
    pool = multiprocessing.pool(32)
    pool.map(Code, listofData)

if main statement
    try:
        code
        multiprocessing()
        sys.exit
    except:
        print error to text file

脚本2(第一个出错的脚本)

import arcpy, fnmatch, os, shutil, sys, traceback
import multiprocessing
from time import strftime
#===========================================================================================
ras_dir = r'C:\Path\to\Input'
working_dir = r'C:\Path\to\Output'
output_dir = os.path.join(working_dir, 'Results')
if not os.path.isdir(output_dir):
    os.mkdir(output_dir)
#===========================================================================================        
global input_files1
global raslist
global ras
raslist = []
input_files1 = []
#===========================================================================================        
for r, d, f in os.walk(working_dir):
    for inFile in fnmatch.filter(f, '*.shp'):
        input_files1.append(os.path.join(r, inFile))

for r, d, f in os.walk(ras_dir):
    for rasf in fnmatch.filter(f,'*.tif'):
        raslist.append(os.path.join(r, rasf))

ras = raslist[0]        
del rasf,raslist    

def rasextract(file):

    arcpy.CheckOutExtension("Spatial")
    arcpy.env.overwriteOutput = True
    proj = file.split('.')
    proj = proj[0] + '.' + proj[1] + '.prj'
    arcpy.env.outputCoordinateSystem = arcpy.SpatialReference(proj)

    try:

        filename = str(file)
        filename = filename.split('\\')
        filename = filename[-1]
        filename = filename.split('.')
        filename = filename[0]

        tif_dir = output_dir + '\\' + filename
        os.mkdir(tif_dir)
        arcpy.env.workspace = tif_dir
        arcpy.env.scratchWorkspace = tif_dir

        dname = tif_dir + '\\' + filename + '_ras.tif'
        fname = working_dir+ '\\' + filename + '_ras.tif'
        bufname = tif_dir + '\\' + filename + '_rasbuf.shp'

        arcpy.Buffer_analysis(file, bufname, "550 METERS", "FULL", "ROUND", "ALL")

        newras = arcpy.sa.ExtractByMask(ras, bufname)
        newras.save(rasname)

        print "Saved " + filename + " ras"
        sys.exit


    except:
        var = traceback.format_exc()
        x = str(var)
        timecode = strftime("%a, %d %b %Y %H:%M:%S + 0000")
        logfile = open(r'C:\ErrorLogs\Log_Script2_rasEx.txt', "a+")
    ent = "\n"
        logfile.write(timecode + "             " + x + ent)
        logfile.close()

def MCprocess():
    pool = multiprocessing.Pool(32)
    pool.map(rasextract, input_files1)


if __name__ == '__main__':

    try:

        arcpy.CheckOutExtension("Spatial")  
        ras_dir = r'C:\Path\to\Input'
        working_dir = r'C:\Path\to\Output'
        output_dir = os.path.join(working_dir, 'Results')
        if not os.path.isdir(output_dir):
            os.mkdir(output_dir)
        #=============================================================      
        raslist = []
        input_files1 = []
        #=============================================================      
        for r, d, f in os.walk(working_dir):
            for inFile in fnmatch.filter(f, '*.shp'):
                input_files1.append(os.path.join(r, inFile))

        for r, d, f in os.walk(ras_dir):
            for demf in fnmatch.filter(f,'*.tif'):
                demlist.append(os.path.join(r, rasf))

        ras = raslist[0]        
        del rasf,raslist
        MCprocess()
        sys.exit

    except:
        var = traceback.format_exc()
        x = str(var)
        timecode = strftime("%a, %d %b %Y %H:%M:%S + 0000")
        logfile = open(r'C:\ErrorLogs\Log_Script2_rasEx.txt', "a+")
        ent = "\n"
        logfile.write(timecode + "             " + x + ent)
        logfile.close()

新错误消息

禁用错误报告后遇到此错误。

enter image description here

2 个答案:

答案 0 :(得分:0)

Windows正在捕捉错误。

尝试在注册表中禁用“窗口错误报告”。之后,应显示回溯/错误。 Here您可以找到有关如何为Windows 10禁用“WER”的说明。

答案 1 :(得分:0)

发布这个是因为这是我能找到的唯一匹配我的错误的网络搜索(这是一个脚本在 IDLE 中完美运行,但是当从批处理(.bat)调用时抛出“Python 已停止工作”错误) 文件) - 完全公开,我使用的是搁置,而不是使用 arcpy。

我认为问题在于您以某种方式让文件“打开”,然后当脚本结束时,Python 被迫以“计划外”的方式清理打开的文件。在 IDE 中,这会被捕获并处理,但是一旦在批处理文件中,问题就会冒泡以显示“停止工作”

对比:

f = open("example.txt", "r")

f = open("example.txt", "r")
f.close()

第一个会从 bat 文件中出错,第二个不会。