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

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. 什么叫做ECS云服务器?

    什么是ECS云服务器,阿里ECS云服务器与虚拟主机的区别是什么.以前,ECS云服务器还不带"云"字,只是叫做"服务器",毫无疑问"ECS云服务器&qu ...

  2. Java安全之原生readObject方法解读

    Java安全之原生readObject方法解读 0x00 前言 在上篇文章分析shiro中,遇到了Shiro重写了ObjectInputStream的resolveClass导致的一些基于Invoke ...

  3. 手写开源ORM框架介绍

    手写开源ORM框架介绍 简介 前段时间利用空闲时间,参照mybatis的基本思路手写了一个ORM框架.一直没有时间去补充相应的文档,现在正好抽时间去整理下.通过思路历程和代码注释,一方面重温下知识,另 ...

  4. Shell----监控CPU/内存/负载高时的进程

    Shell----监控CPU/内存/负载高时的进程 1.编写脚本 vim cpu-warning.sh #!/bin/bash #监控系统cpu的情况脚本程序 #取当前空闲cpu百份比值(只取整数部分 ...

  5. Python利用openpyxl带格式统计数据(1)- 处理excel数据

    统计数据的随笔写了两篇了,再来一篇,这是第三篇,前面第一篇是用xlwt写excel数据,第二篇是用xlwt写mysql数据.先贴要处理的数据截图: 再贴最终要求的统计格式截图: 第三贴代码: 1 '' ...

  6. 每日CSS_仿苹果平滑开关按钮

    每日CSS_仿苹果平滑开关按钮 2020_12_24 源码 1. 代码解析 1.1 html 代码解析 <div class="checkbox"> <div c ...

  7. 基于Redis的消息队列使用:spring boot2.0整合redis

    一 . 引入依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="ht ...

  8. 【Azure App Service】C#下制作的网站,所有网页本地测试运行无误,发布至Azure之后,包含CHART(图表)的网页打开报错,错误消息为 Runtime Error: Server Error in '/' Application

    问题描述 C#下制作的网站,所有网页本地测试运行无误,发布至Azure之后,包含CHART(图表)的网页打开报错,错误消息为 Runtime Error: Server Error in '/' Ap ...

  9. struts文件上传拦截器分析

    struts有默认的文件拦截器,一般配置maximumSize就可以了. 知道原理,我们可以写一个类继承它,实现自己的配置上传文件大小的方式.   然后细究页面上传文件的时候,发现了一些问题. act ...

  10. easyui模板页面 不良调查

    <%@page import="com.xy.cc.util.CUtil" %><%@page import="com.xy.cc.bean.UserP ...