luzi0206 2024-03-19 15:36 采纳率: 100%
浏览 3
已结题

python 引用函数模块时出现的问题

我希望可以动态控制sys.path的内容,防止搜索路径的混乱。
我在子函数的初期追加了搜索范围,又在子函数的结尾将搜索路径还原,但是发现并没有实现我想要的结果。
文件夹结构

img

def_3_main.py的内容def def_3_test2_good():

def def_3_test2_good():
    import os
    import sys
    import copy
    # 保存原始的sys.path
    original_sys_path = copy.deepcopy(list(sys.path))
    script_dir = os.path.dirname(os.path.abspath(__file__))
    print("当前脚本所在位置:", script_dir)
    print("当前搜索路径:")
    print("\n".join(sys.path))
    sys.path.append(script_dir+"//..//def_2")
    print("追加搜索路径后:")
    print("\n".join(sys.path))
    from print_test import print_test
    print_test()    
    # 恢复原始的sys.path
    sys.path = original_sys_path
    print("还原搜索路径后:")
    print("\n".join(sys.path))
def def_3_test3():
    import os
    import sys
    
    script_dir = os.path.dirname(os.path.abspath(__file__))
    print("当前脚本所在位置:", script_dir)
    print("当前搜索路径:")
    print("\n".join(sys.path))
    # sys.path.append(script_dir+"//..//def_1")
    from print_test import print_test
    print_test() 

if __name__ == '__main__':
    def_3_test2_good()
    def_3_test3()

输出结果

当前脚本所在位置: f:\实验\test_def\def_3
当前搜索路径:
f:\实验\test_def\def_3
D:\Program Files (x86)\Python\Python39\python39.zip
D:\Program Files (x86)\Python\Python39\DLLs
D:\Program Files (x86)\Python\Python39\lib
D:\Program Files (x86)\Python\Python39
C:\Users\Administrator\AppData\Roaming\Python\Python39\site-packages
D:\Program Files (x86)\Python\Python39\lib\site-packages
追加搜索路径后:
f:\实验\test_def\def_3
D:\Program Files (x86)\Python\Python39\python39.zip
D:\Program Files (x86)\Python\Python39\DLLs
D:\Program Files (x86)\Python\Python39\lib
D:\Program Files (x86)\Python\Python39
C:\Users\Administrator\AppData\Roaming\Python\Python39\site-packages
D:\Program Files (x86)\Python\Python39\lib\site-packages
f:\实验\test_def\def_3//..//def_2
def_2
还原搜索路径后:
f:\实验\test_def\def_3
D:\Program Files (x86)\Python\Python39\python39.zip
D:\Program Files (x86)\Python\Python39\DLLs
D:\Program Files (x86)\Python\Python39\lib
D:\Program Files (x86)\Python\Python39
C:\Users\Administrator\AppData\Roaming\Python\Python39\site-packages
D:\Program Files (x86)\Python\Python39\lib\site-packages
当前脚本所在位置: f:\实验\test_def\def_3
当前搜索路径:
f:\实验\test_def\def_3
D:\Program Files (x86)\Python\Python39\python39.zip
D:\Program Files (x86)\Python\Python39\DLLs
D:\Program Files (x86)\Python\Python39\lib
D:\Program Files (x86)\Python\Python39
C:\Users\Administrator\AppData\Roaming\Python\Python39\site-packages
D:\Program Files (x86)\Python\Python39\lib\site-packages
def_2

上面代码的运行应该出错的,但是子函数def_3_test3()依旧运行了,即搜索路径列表显示减少了,但是实际却没有减少。
询问是什么造成的?

  • 写回答

3条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-03-19 15:36
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题的原因是在Python中,模块(module)只会被导入一次,并且在导入之后会被缓存起来,以提高程序运行速度。而在缓存之中已存在的模块,在后续的导入中将不会重新执行模块内的代码。因此,即使在子函数def_3_test2_good()中恢复了原始的sys.path,但是在后续的调用def_3_test3()中,由于之前已经导入了print_test模块,因此不会重新执行模块内的代码,导致搜索路径并未还原。 因此,解决这个问题的办法是在导入print_test模块之前,删除sys.modules中缓存的print_test模块,以保证模块的重新导入。代码如下:
    import sys
    if 'print_test' in sys.modules:
        del sys.modules['print_test']
    from print_test import print_test
    

    以上代码先判断模块是否在sys.modules缓存中存在,如果存在,则删除缓存中的模块。然后再导入print_test模块,此时将会重新执行模块内的代码,达到了恢复搜索路径的目的。在子函数def_3_test2_good()中使用该代码替换原来的import语句即可。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月27日
  • 已采纳回答 3月19日
  • 创建了问题 3月19日