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学习笔记- Python threading模块
Python threading模块 直接调用 # !/usr/bin/env python # -*- coding:utf-8 -*- import threading import time d ...
Python中模块之os的功能介绍
Python中模块之os的功能介绍 1. os的变量 path 模块路径 方法:os.path 返回值:module 例如:print(os.path) >>>
python中使用ctypes调用MinGW生成的动态链接库(dll)
关于gcc编译dll的我就不说了,网上举例一大堆,下面以g++为例. 假设有一个test.cpp文件如下: extern "C" { __declspec(dllexport) d ...
查看python中模块的所有方法
查看python中模块的所有方法 安装的python模块,现将查看方法总结如下 一.CMD命令行下使用pydoc命令 在命令行下运行$ pydoc modules即可查看 二.在python交 ...
[python]关于在python中模块导入问题追加总结
[背景] 最近在写程序时,我使用的eclipse编辑器运行都没有问题,然后部署到自动化环境上却偏偏报找不到相应模块问题,现在对该问题在之前的贴子上追加总结 原帖子:[python]关于python中模 ...
《构建之法》教学笔记——Python中的效能分析与几个问题
中第2章对效能分析进行了介绍,基于的工具是VSTS.由于我教授的学生中只有部分同学选修了C#,若采用书中例子讲解,学生可能理解起来比较困难.不过所有这些学生都学习 ...
Python中模块之copy的功能介绍
模块之copy的功能介绍 copy主要分两种: 1.浅拷贝 2.深拷贝 赋值: 在python中赋值算特殊的拷贝,其实赋值可以理解为同一个对象有两个名字,所以当其中一个发生变化,另一个也跟着会变化. ...
Python中模块的发布与安装
模块(Module) Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要调用sqrt函数,必须用import关键字引入math这个 ...
Python中模块(Module)和包(Package)的区别
本文绝大部分内容转载至:廖雪峰官方网站 1. 模块(Module) 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函 ...
随机推荐
java中的集合
集合比数组的优势: 1.集合可以存任意类型的变量,长度是可变的 2.数组只能存同一类型的变量,长度是固定的 3.集合中只能存对象 List集合 : 接口 提供公有的方法 特有的方法: 1.List中 ...
线段树 + 矩阵 --- ZOJ 3772 Calculate the Function
Calculate the Function Problem's Link: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCod ...
delphi SpeedButtonDown
的属性 的事件 的方法 设置SpeedButton的Down的属性 AllowAllUp属性 当有多个SpeedButton时 让有2个按钮都能处于按下状态 设置它的GroupIndex ...
使用NetUserAdd API函数创建远程用户
http://apps.hi.baidu.com/share/detail/33407620 使用NetUserAdd编程创建远程用户Windows API NetUserAdd()可以创建Windo ...
Codeforces Round #352 (Div. 2) (A-D)
672A Summer Camp 题意: 1-n数字连成一个字符串, 给定n , 输出字符串的第n个字符.n 很小, 可以直接暴力. Code: #include
springboot源码解读01
package org.springframework.web; @javax.servlet.annotation.HandlesTypes({org.springframework.web.Web ...
windows 10 安装TortoiseSVN.msi时报2503的错误
解释: 出现这个错误的原因是权限不足,右击安装程序也没有“以管理员身份运行”按钮. 解决: 输入 msiexec /package F:\TortoiseSVN-1.9.7.27907-x64.ms ...
在nginx中,禁止IP访问.只可以使用域名访问.
if ($host ~* "\d+\.\d+\.\d+\.\d+"){ ; } 其实说白了, 就是进行host主机头过滤,使用正则来判断下.
oozie 安装过程详解
1.从apache的官网下载oozie3.3.2 2.编译oozie,以下命令用root来执行吧,它不做任何的测试的,因为一测试就会出错的 官网估计也知道,所以顺便也提供了一个跳过参数的命令... b ...
echarts折线图个性化填充、线条、拐点样式
由于每组数据的拐点样式.线条颜色都不一样,所以series里的每组数据都需要单独设置样式. 首先先来看一下完成后的效果吧 具体设置如下 series: [ { name:systemName[0], ...