如何让自定义模块引用主Python上的导入模块

时间:2018-08-17 06:46:22

标签: python tensorflow

这是我存储在util.py中的自定义模块,该模块总结了我使用tensorflow时读取图像所经历的三步操作

#tf_load_image from path 
def load_image(image_path, image_shape, clr_normalize = True ):
    '''returns tensor-array on given image path and image_shape [height, width]'''
    import tensorflow as tf
    image = tf.read_file(image_path)
    image = tf.image.decode_jpeg(image, channels=3)
    if clr_normalize == True:
        image = tf.image.resize_images(image, image_shape) / 127.5 - 1
    else:
        image = tf.image.resize_images(image, image_shape)
    return image   

但是,这在处理大量图像负载方面效率很低,因为每次我读“单个图像”时,它通常都会调用import tensorflow as tf

我想让此函数从实际导入load_image的tf的tf继承main.py命令。

就像..

import tensor flow as tf
from util import load_image

image = load_image("path_string") #where load_image no longer wraps the import tensorflow as tf in itself.

2 个答案:

答案 0 :(得分:1)

  

但这效率很低(...),因为每次我读“单个图像”时,它通常都会调用import tensorflow as tf

已导入的模块在首次导入时被缓存在sys.modules中(我的意思是“在给定进程中第一次导入模块”),后续调用将从该缓存中检索已导入的模块,因此开销是比您想象的要少。但是无论如何:

  

我想让此函数从实际导入load_image的main.py的tf继承tf命令。

唯一的方法是将模块显式传递给您的函数,即:

# utils.py

def load_image(tf, ....):
    # code here using `tf`

然后

# main.py

import tensorflow as tf
from utils import load_image
im = load_image(tf, ...)

这实际上是完全没有用的:您要做的就是在utils.py中将import语句移出函数:

# utils.py

import tensorflow as tf
def load_image(image_path, image_shape, clr_normalize = True ):
    '''returns tensor-array on given image path and image_shape [height, width]'''
    import tensorflow as tf
    image = tf.read_file(image_path)
    image = tf.image.decode_jpeg(image, channels=3)
    if clr_normalize:
        image = tf.image.resize_images(image, image_shape) / 127.5 - 1
    else:
        image = tf.image.resize_images(image, image_shape)
    return image   

FWIW,it IS officially recommanded to put all your imports at the top of the module,在任何其他定义(函数,类等)之前。在函数中的导入仅应作为循环导入的Q&D不得已的修复方法(通常这是确定设计存在问题的肯定信号,实际上应该通过修复设计本身来进行修复)。

答案 1 :(得分:0)

正如@MatrixTai在评论中建议的那样,您可以像这样制作utils.py

import tensorflow as tf

def load_image(.........):
    ............

,在main.py中,您可以根据需要import util