从文件导入的Python函数找不到模块:原因及解决方法?
问题原因与解决方案
原因
Python中每个.py文件都是独立的模块,拥有专属的命名空间。你在主脚本里导入的cv2只存在于主脚本的命名空间中,functions.py作为单独模块,自身命名空间里并没有cv2,所以myfun_fromfile调用cv2时会触发NameError。
- 内联函数
myfun_inline定义在主脚本内,属于主脚本的命名空间,因此能直接访问主脚本中已导入的cv2。 myfun_fromfile_containsimport在函数内部导入cv2,是将cv2加载到了函数的局部命名空间,所以能正常调用,但这种写法不规范——虽Python会缓存模块,不会重复加载,但会破坏代码结构的整洁性。
正确解决方案
在functions.py的顶部直接导入cv2,让模块的命名空间包含cv2,这样模块内所有函数都能直接使用,既实现了函数与工作流的分离,又符合Python代码规范。
修改后的functions.py:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import cv2 # 在模块顶部统一导入所需模块 def myfun_fromfile(path_to_image): img = cv2.imread(path_to_image, cv2.IMREAD_UNCHANGED) return img def myfun_fromfile_containsimport(path_to_image): img = cv2.imread(path_to_image, cv2.IMREAD_UNCHANGED) return img
主脚本无需修改,导入并调用myfun_fromfile即可正常运行。
内容的提问来源于stack exchange,提问作者R Greg Stacey
相关产品推荐
相关产品推荐

