Python中无法修改PYTHONPATH及文件名时,如何导入不同文件夹的同名文件?
解决同名模块导入问题
首先纠正一个关键错误:你的PYTHONPATH设置错了——它应该添加目录路径,而不是具体的.py文件路径。这也是你之前导入异常的根源之一。
针对你的场景,无法修改文件名或PYTHONPATH的话,有两种可靠的方法导入Folder1中的needtotest.py:
方法一:调整sys.path优先级
通过把Folder1的目录路径插入到sys.path最前面,让Python优先搜索这个目录下的模块:
import sys import os # 获取测试文件所在目录的绝对路径 test_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接出Folder1的绝对路径 folder1_path = os.path.join(test_dir, "../Task/Folder1") # 插入到sys.path最前面,确保优先加载Folder1的模块 sys.path.insert(0, folder1_path) # 现在导入的needtotest就是Folder1中的版本 import needtotest
注:之前用sys.append无效是因为append会把路径加到末尾,Python搜索模块时会先找PYTHONPATH里已有的路径(Folder2相关),所以优先加载了Folder2的文件。
方法二:直接加载指定文件(推荐)
用importlib.util模块直接加载目标文件,完全绕过sys.path的搜索机制,避免同名冲突:
import importlib.util import os test_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接Folder1中needtotest.py的绝对路径 target_file = os.path.join(test_dir, "../Task/Folder1/needtotest.py") # 创建模块规范并加载 spec = importlib.util.spec_from_file_location("folder1_needtotest", target_file) folder1_needtotest = importlib.util.module_from_spec(spec) spec.loader.exec_module(folder1_needtotest) # 直接通过加载后的模块对象调用函数,比如: # folder1_needtotest.lambda_handler(...)
关于你遇到的语法错误
你尝试from Proj.Task.Folder2.needtotest import lambda_handler报错,是因为Proj、Task等目录没有被识别为Python包。要使用这种绝对导入方式,需要在Proj、Task、Folder1、Folder2每个目录下创建空的__init__.py文件(Python 3.3+支持命名空间包,但兼容性不如显式添加__init__.py)。不过这种方法需要修改目录结构,如果你不想这么做,上面两种方法更适合你。
内容的提问来源于stack exchange,提问作者Prboetic
相关产品推荐
相关产品推荐

