zoukankan      html  css  js  c++  java
  • [笔记]Python中模块互相调用的例子

    python中模块互相调用容易出错,经常是在本地路径下工作正常,切换到其他路径来调用,就各种模块找不到了。
    解决方法是通过__file__定位当前文件的真实路径,再通过sys.path.append()来获取相对路径更新$PATH即可。

    假设代码结构如下:

    - mod_a
        __init__.py     # 模块文件夹内必须有此文件
        aaa.py
    - mod_b
        __init__.py     # 模块文件夹内必须有此文件
        bbb.py
    - ccc.py
    
    • 调用同级模块

    如果aaa.py要调用bbb.py的内容,可以在aaa.py中如下写:

    import sys
    sys.path.append(osp.join(osp.dirname(__file__), '..'))  # 扫除路径迷思的关键!
    from mod_b.bbb import *
    
    • 调用下级模块

    如果ccc.py要调用bbb.py的内容,可以在ccc.py中如下写:

    from mod_b.bbb import *
    
    • 调用上级模块

    如果aaa.py要调用ccc.py的内容,可以在aaa.py中如下写:

    import sys
    sys.path.append(osp.join(osp.dirname(__file__), '..'))
    from ccc import *
    

    代码示例:

    aaa.py如下:

    # -*- coding: utf-8 -*-
    
    from __future__ import print_function
    import os.path as osp
    import sys
    sys.path.append(osp.join(osp.dirname(__file__), '..'))
    from mod_b.bbb import *
    from ccc import *
    
    def print_a():
      print('this is a')
      
    def _call_mod_b():
      print_a()
      print_b()
      
    def _call_mod_c():
      print_c()
    
    
    if __name__=='__main__':
      _call_mod_b()
      _call_mod_c()
    

    bbb.py如下:

    # -*- coding: utf-8 -*-
    
    from __future__ import print_function
    
    def print_b():
      print('this is b')
    
    
    if __name__=='__main__':
      pass
    

    ccc.py如下:

    # -*- coding: utf-8 -*-
    
    from __future__ import print_function
    from mod_b.bbb import *
    
    def print_c():
      print('this is c')
      
    def _call_mod_b():
      print_c()
      print_b()
      
    
    if __name__=='__main__':
      _call_mod_b()
    

    如此,当不管在何处调用aaa.py时,结果都一样,如下:

    this is a
    this is b
    this is c
    

    如果调用ccc.py,结果如下:

    this is c
    this is b
    
  • 相关阅读:
    C# List<T>用法(转)
    任务列表 (Visual Studio)
    TSQL行转列、列转行
    HRESULT:0x80070057 (E_INVALIDARG)的异常的解决方案(转)
    JS正则表达式详解(转)
    Windows远程登录命令
    JavaScript中的try...catch和异常处理(转)
    javascript如何触发button 的click事件
    在ASP.NET中利JavaScript实现控件的聚焦(转)
    输入一个字符串,将其逆序后输出。(使用C++,不建议用伪码)
  • 原文地址:https://www.cnblogs.com/journeyonmyway/p/9492544.html
Copyright © 2011-2022 走看看