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

[笔记]Python中模块互相调用的例子的更多相关文章

  1. Python学习笔记- Python threading模块

    Python threading模块 直接调用 # !/usr/bin/env python # -*- coding:utf-8 -*- import threading import time d ...

  2. Python中模块之os的功能介绍

    Python中模块之os的功能介绍 1. os的变量 path 模块路径 方法:os.path 返回值:module 例如:print(os.path) >>> <module ...

  3. 第7.22节 Python中使用super调用父类的方法

    第7.22节 Python中使用super调用父类的方法 前面章节很多地方都引入了super方法,这个方法就是访问超类这个类对象的.由于super方法的特殊性,本节单独谈一谈super方法. 一.su ...

  4. python中使用ctypes调用MinGW生成的动态链接库(dll)

    关于gcc编译dll的我就不说了,网上举例一大堆,下面以g++为例. 假设有一个test.cpp文件如下: extern "C" { __declspec(dllexport) d ...

  5. 查看python中模块的所有方法

    查看python中模块的所有方法     安装的python模块,现将查看方法总结如下 一.CMD命令行下使用pydoc命令 在命令行下运行$ pydoc modules即可查看 二.在python交 ...

  6. [python]关于在python中模块导入问题追加总结

    [背景] 最近在写程序时,我使用的eclipse编辑器运行都没有问题,然后部署到自动化环境上却偏偏报找不到相应模块问题,现在对该问题在之前的贴子上追加总结 原帖子:[python]关于python中模 ...

  7. Python中模块调用说明

    1 import test # 导入test模块 2 3 print(test.a) # 使用"模块.变量"调用模块中的变量 4 5 test.hi() # 使用"模块. ...

  8. 《构建之法》教学笔记——Python中的效能分析与几个问题

    <构建之法:现代软件工程>中第2章对效能分析进行了介绍,基于的工具是VSTS.由于我教授的学生中只有部分同学选修了C#,若采用书中例子讲解,学生可能理解起来比较困难.不过所有这些学生都学习 ...

  9. Python中模块之copy的功能介绍

    模块之copy的功能介绍 copy主要分两种: 1.浅拷贝 2.深拷贝 赋值: 在python中赋值算特殊的拷贝,其实赋值可以理解为同一个对象有两个名字,所以当其中一个发生变化,另一个也跟着会变化. ...

随机推荐

  1. 【noip模拟题】藏宝图(prim)

    好神的一题.. 一开始没想多久就看题解了QAQ.. 首先我们发现,这棵树任意两个点的边一定是最小的(即所有其它这两个点的路径都比这条边大,才有可能出解) 然后生成树后再算距离判断即可.. 注意特判n= ...

  2. jconsole监控tomcat

    一.专业术语 GC垃圾回收机制:当需要分配的内存空间不再使用的时候,JVM将调用垃圾回收机制来回收内存空间. JMX(Java Management Extensions,即Java管理扩展)是一个为 ...

  3. WPF - 绑定及惯用法(一)

    写在前面:这仍然是一些没有经过严格审阅的文字.虽然我的确执行了初稿.复稿以及审阅等一系列用以保证文章质量的方法,但是仍然担心其中是否有错误.希望您能帮助指出,以在下一次我在版本更新时进行修正.所有的错 ...

  4. SqlAlchemy使用详解

    python之sqlalchemy创建表的实例详解 通过sqlalchemy创建表需要三要素:引擎,基类,元素 from sqlalchemy import create_engine from sq ...

  5. DML语句报错是因为控制文件无法扩大还是另有原因?

    今天处理了一个很有意思的故障问题,来龙去脉是这种: 客户来电咨询控制文件无法扩展,数据库仅仅能查询但不支持DML,须要远程支持.接到电话的第一反应就是CONTROL_FILE_RECORD_KEEP_ ...

  6. iOS开发之--TableViewCell重用机制避免重复显示问题

    常规配置如下 当超过tableView显示的范围的时候 后面显示的内容将会和前面重复 // 这样配置的话超过页面显示的内容会重复出现 - (UITableViewCell *)tableView:(U ...

  7. Xmanager连接图形界面

    1.编辑gnome配置文件vim /etc/gdm/custom.conf # GDM configuration storage [daemon]RemoteGreeter= /usr/libexe ...

  8. .NET开发过程中的全文索引使用技巧之Solr

        前言:相信许多人都听说过.net开发过程中基于Lucene.net实现的全文索引,而Solr是一个高性能,基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查 ...

  9. 输入一个long类型的整数,输出一个以金融格式表示的字符串

    package test; public class Test { public static void main(String[] args) { System.out.println(yuan(1 ...

  10. 【BZOJ3232】圈地游戏 分数规划+最小割

    [BZOJ3232]圈地游戏 Description DZY家的后院有一块地,由N行M列的方格组成,格子内种的菜有一定的价值,并且每一条单位长度的格线有一定的费用. DZY喜欢在地里散步.他总是从任意 ...