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条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 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日

悬赏问题

  • ¥18 关于#贝叶斯概率#的问题:这篇文章中利用em算法求出了对数似然值作为概率表参数,然后进行概率表计算,这个概率表是怎样计算的呀
  • ¥15 Android Navigation: 某XDirections类不能自动生成
  • ¥20 C#上传XML格式数据
  • ¥15 elementui上传结合oss接口断点续传,现在只差停止上传和继续上传,各大精英看下
  • ¥100 单片机hardfaulr
  • ¥20 手机截图相片分辨率降低一半
  • ¥50 求一段sql语句,遇到小难题了,可以50米解决
  • ¥15 速求,对多种商品的购买力优化问题(用遗传算法、枚举法、粒子群算法、模拟退火算法等方法求解)
  • ¥100 速求!商品购买力最优化问题(用遗传算法求解,给出python代码)
  • ¥15 虚拟机检测,可以是封装好的DLL,可付费