实际工程的组织架构一般是这样的:

bin包下的bin.py是实际的执行文件,my_mould包下的是业务逻辑的实现模板

bin.py需要import my_mould下的py文件,而bin和my_mould是平级的

所以在bin.py中直接import会报错:

from my_mould import main

if __name__=='__main__':
main.run()
结果:

Traceback (most recent call last):
File "E:/PyCode/模块/bin/bin.py", line 17, in <module>
from my_mould import main
ImportError: No module named 'my_mould'

找不到my_mould这个包,因为sys.path中的第一个当前路径是bin,而不是上一级“模板”,当前路径是“模板”才能import my_mould

如何解决这个问题:

版本一:把“模板”那一层加到sys.path

import sys
sys.path.append(r'E:\PyCode\模块')
from my_mould import main
if __name__=='__main__':
main.run()
结果:5

没问题,但是这样写死sys.path,代码移植到别人的电脑上就跑不起来了

版本二

利用os模板,从后面往前推,

找到当前文件:bin.py

再找到文件的绝对路径:E:\PyCode\模块\bin\bin.py

再找到上一级路径:E:/PyCode/模块/bin

最后找到上上级路径:E:/PyCode/模块

然后把这个路径定义为BASE_DIR,添加到sys.path

这里要用到方法:

print(__file__)                                       #__file__表示文件本身,结果应该是bin.py,这里之所以是bin.py的绝对路径,是因为pycharm擅自加的,如果在cmd执行就是文件本身
print(os.path.abspath(__file__)) #abspath(__file__)才是python解释器给的正真的文件绝对路径
print(os.path.dirname(__file__)) #dirname(__file__)返回文件或文件夹的所处于的路径,也就是上一层路径
print(os.path.dirname(os.path.dirname(__file__))) #两层dirname(__file__),就是上上层

结果:

E:/PyCode/模块/bin/bin.py                                #python解释器给出的结果应该是bin.py
E:\PyCode\模块\bin\bin.py
E:/PyCode/模块/bin
E:/PyCode/模块

最终版本

import sys,os
# BASE_DIR = os.path.dirname(os.path.dirname(__file__))
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #拿到 E:/PyCode/模板 这个路径
sys.path.append(BASE_DIR)
# sys.path.append(r'E:\PyCode\模块')
from my_mould import main if __name__=='__main__':
# print(__file__)
# print(os.path.abspath(__file__))
# print(os.path.dirname(__file__))
# print(os.path.dirname(os.path.dirname(__file__)))
# BASE_DIR = os.path.dirname(os.path.dirname(__file__))
main.run()

所以,在日常开发中,结合os.path.abspath(__file__)使用os.path.dirname(__file__)是引用模板的常见方式。

(十三)利用BASE_DIR来import模板的更多相关文章

  1. zabbix利用自带的模板监控mysql数据库

    zabbix利用自带的模板监控mysql数据库 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 有些东西你不会的时候觉得它特别难,但是当你去做的时候就发现如此的简单~zabbix功能 ...

  2. java操作Excel之POI(5)利用POI实现使用模板批量导出数据

    后台导出方法: 在源文件夹src下面放个准备好的模板:/com/cy/template/userExportTemplate.xls,这个模板有头部一行: /** * 后台导出方法 * 利用POI实现 ...

  3. 在服务端C#如何利用NPOI构建Excel模板

    目前本人接触过两种模板导出的方式:(1)C#利用NPOI接口制作Excel模板,在服务端用数据渲染模板(2)在前端利用前人搭建好的框架,利用office编写xml制作模板,在客户端进行数据的渲染,导出 ...

  4. 新知识:Java 利用itext填写pdf模板并导出(昨天奋战到深夜四点,知道今天两点终于弄懂)

    废话少说,不懂itext干啥用的直接去百度吧. ***************制作模板******************* 1.先用word做出界面 2.再转换成pdf格式 3.用Adobe Acr ...

  5. 无插件,无com组件,利用EXCEL、WORD模板做数据导出(一)

    本次随笔主要讲述着工作中是如何解决数据导出的,对于数据导出到excel在日常工作中大家还是比较常用的,那导出到word呢,改如何处理呢,简单的页面导出问题应该不大,但是如果是标准的公文导出呢,要保证其 ...

  6. 如何合理利用iMindMap中的模板创建思维导图

    思维导图的制作并不是一项简单的工作,尤其是对许多工作或学习有特殊要求的朋友而言,当我们需要应对不同场景制作不同的思维导图时,总不能都靠自己从头制作,这样难度比较大也比较耗时.而iMindMap(win ...

  7. 利用C++11可变模板,封装调用dll导出函数

    起因 开发中经常需要动态调用一些导出函数,试着利用C++11特性封装一下 尝试 常规使用 typedef int WINAPI (*TMessageBoxA)(HWND hWnd,LPCSTR lpT ...

  8. Flask06 地址约定、利用falsk提供的方法渲染模板

    1 访问地址约定 在访问路径的末尾是否需要加 / -> 可以加,也可以不加 前端的访问路径必须和后端的路径完全匹配才能够访问成功,如果我们在后台的路径都是以 / 结尾,但是我们的访问路径是没有以 ...

  9. [Python自学] day-18 (2) (MTV架构、Django框架、模板语言)

    一.实现一个简单的Web服务器 使用Python标准库提供的独立WSGI服务器来实现MVC架构. 首先,实现一个简单的Web服务器: from wsgiref.simple_server import ...

随机推荐

  1. 微信开发中,不同手机系统遇到的bug(不定时更新)

    Ios系统 1.body上绑定click事件失效. 解决:body标签下面,用个div,当做包裹所有内容的大容器.给这个div,绑定click事件. 2.不支持 YYYY-MM-DD 的时间格式. 用 ...

  2. DarkMode(1):产品应用深色模式分析

    为什么Dark Mode变得越来越流行 2018 年的 macOS Mojave 率先支持了深色外观,紧接着 Windows 10 在 2018 年的 10 月份大版本更新中,也引入了 Dark Mo ...

  3. [JVM工具(1)] 堆栈检查利器jstat的使用

    jstat 可以检查 JVM 整体的运行情况,可以看到 新生代,老年代等的内存使用情况,以及GC 次数和耗时 命令格式 如 jstat -<option> [-t] [-h<line ...

  4. Spark性能调优九之常用算子调优

    1.使用mapPartitions算子提高性能 mapPartition的优点:使用普通的map操作,假设一个partition中有1万条数据,那么function就要被执行1万次,但是使用mapPa ...

  5. ECharts的基本使用与方法

    ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器,底层依赖轻量级的矢量图形库 ZRender,提供直观,交互丰富,可高度 ...

  6. 用DirectX 11绘制一个Cube

    之前一篇文章讲了如何初始化DirectX 11,现在在此基础上绘制一个Cube,总体可概括为以下几个步骤: 定义Cube顶点数据结构 创建Vertex Buffer和Index Buffer 编写应用 ...

  7. 工具-Git与GitHub-GitHub使用(99.5.3)

    @ 目录 1.在github中添加公钥 2.克隆项目 3.在本地工作区新建分支,修改文件并提交 4.推送到远程仓库 5.从远程分支上拉取代码 关于作者 1.在github中添加公钥 首次使用git必须 ...

  8. 纯Python绘制艺术感满满的山脊地图,创意满分

    1 简介 下面的这幅图是英国摇滚乐队 Joy Division 在1979年发行的其第一张录音室专辑 Unknown Pleasures 的封面,由艺术家 Peter Saville 基于射电脉冲星信 ...

  9. 要多用Java帮助文档

    从第一次接触Java到现在,大概两年了吧,间断断续续的学习.毕竟还在上课,其他课程也挺耗时间,但更多的还是自己不自律,很多时间都在玩. 平时用的有eclipse和IDEA,使用快捷方式有时看看源码,也 ...

  10. Mac 上使用 Shell 脚本 + adb shell 实现简单的 Android 模拟点击自动化测试

    需求 在 A 界面,点击跳转到 B 界面(该界面会执行一些业务),再点击返回键出现 Dialog 弹窗,点击确认退出按钮,返回 A 界面.不断循环. 思路 一开始想到的就是按键精灵,下了 mac 版使 ...