微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

退出后如何访问在“ while True:try / break”循环内生成的局部变量?

如何解决退出后如何访问在“ while True:try / break”循环内生成的局部变量?

我编写了一个模块,该模块将目录中的所有TIFF图像取走,对每个图像文件中的所有帧取平均,然后将平均后的图像保存到outputPath指定的自动生成的子目录中:

def average_tiff_frames(inputPath):
    '''
    This function opens all TIFF image files in a directory,averages over all frames within each TIFF file,and saves the averaged images to a subdirectory.
    
    Parameters
    ----------
    inputPath : string
        Absolute path to the raw TIFF files
    '''
    import datetime
    import os
    
    import numpy as np

    from PIL import Image
    
    
    # Read image file names,create output folder
    while True:
        try:
            inputPath = os.path.join(inputPath,'')    # Add trailing slash or backslash to the input path if missing
            filenames = [filename for filename in os.listdir(inputPath)
                            if filename.endswith(('.tif','.TIF','.tiff','.TIFF'))
                            and not filename.endswith(('_avg.tif'))]
            outputPath = os.path.join(inputPath,datetime.datetime.Now().strftime('%Y%m%dT%H%M%s'),'')
            os.mkdir(outputPath)
            break
        except FileNotFoundError:
            print('TIFF file not found - or - frames in TIFF file already averaged (file name ends with "_avg.tif")')

    # Open image files,average over all frames,save averaged image files
    for filename in filenames:
        img = Image.open(inputPath + filename)

        width,height = img.size
        NFrames = img.n_frames

        imgArray = np.zeros((height,width))    # Ordering of axes: img.size returns (width,height),np.zeros takes (rows,columns)
        for i in range(NFrames):
            img.seek(i)
            imgArray += np.array(img)
            i += 1
        imgArrayAverage = imgArray / NFrames

        imgAverage = Image.fromarray(imgArrayAverage)
        imgAverage.save(outputPath + filename.rsplit('.')[0] + '_avg' + '.tif')

        img.close()

    return outputPath
    print('Averaged TIFF images have been saved to ' + outputPath + '. The output path is returned as a string to the variable "outputPath".')

执行模块后,我希望outputPath(即分配给它的字符串)可用于后续步骤。但是,当做

average_tiff_frames(inputPath)
print(outputPath)

我收到以下错误

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-5-99d0a947275c> in <module>()
      1 inputPath = '/home/user/Desktop/data/'
      2 average_tiff_frames(inputPath)
----> 3 print(outputPath)

NameError: name 'outputPath' is not defined

这是什么问题?

我首先想到的是outputPathwhile True: try循环的局部变量,并且在break之后被销毁,所以我在循环之前实例化了一个空字符串outputPath = '',但这没有帮助。

解决方法

您不是要在循环外访问变量,而是要完全在方法之外访问它。方法返回您要查找的值,因此将该值设置为变量:

outputPath = average_tiff_frames(inputPath)

print(outputPath)

或者直接打印:

print(average_tiff_frames(inputPath))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。