Python不同目录间进行模块调用的实现方法


Posted in Python onJanuary 29, 2019

一、背景

之前写了软件开发目录规范这篇博客,相信很多人都已经知道,我们在写程序时需要遵循一定的规范,不然,就算很简答的逻辑程序的代码,读起来会很费劲,占用了我们大量的时间,但是,我们一旦用了这样的规范目录,我们怎么去愉快的进行模块之前的相互导入呢?这就不得不说我们今天讨论的两个概念:绝对路径和相对路径。

二、函数功能解释

1、__file__

功能:返回自身文件的相对路径

#atm.py中的代码
print(__file__)
 
#pycharm的执行结果
D:\Python\Python35\python.exe D:/PycharmProjects/51homework/Atm/bin/atm.py
D:/PycharmProjects/51homework/Atm/bin/atm.py #打印出绝对路径
#从cmd执行atm.py 
D:\PycharmProjects\51homework>python Atm/bin/atm.py 
Atm/bin/atm.py  #打印的是相对路径

从上面看,为什么pycharm中执行的结果是绝对路径,而从cmd调用python命令时显示的却是相对路径?你从pycharm的执行结果可以看出,在pycharm执行atm.py文件时,是从绝对路径下去执行的,而你从cmd下去执行的时候,是你选择可以在哪个路径下执行,而__file__表示的是相对路径,所以在哪个路径下,就打印哪个路径。

2、os.path.abspath()

功能:返回自身文件的绝对路径

#atm.py的文件代码
import os
print(os.path.abspath(__file__))
#在cmd中的执行结果
D:\PycharmProjects\51homework>python Atm/bin/atm.py
D:\PycharmProjects\51homework\Atm\bin\atm.py #获取atm.py的绝对路径

3、os.path.dirname()

功能:返回目录名,不需要文件名

print(os.path.dirname( os.path.abspath(__file__) ))
D:\PycharmProjects\51homework\Atm\bin #只返回目录名,不需要文件名

4、sys.path

功能:python环境的执行的环境变量

import sys
print(sys.path)
#cmd执行的结果
['D:\\PycharmProjects\\51homework\\Atm\\bin', 'D:\\Python\\Python35\\python35.zip',
 'D:\\Python\\Python35\\DLLs', 'D:\\Python\\Python35\\lib', 'D:\\Python\\Python35', 
'D:\\Python\\Python35\\lib\\site-packages']

注:执行路径是列表的形式打印出来的,所以sys.path数据类型是一个列表。

三、绝对路径和相对路径

1、绝对路径

绝对路径:从根目录为起点到你所在的目录。

>>> import os
>>> os.chdir("D:\\PycharmProjects\\51homework\\Atm\\bin\\")
>>> os.listdir()
['atm.py', '__init__.py']
>>> os.path.abspath('atm.py')
'D:\\PycharmProjects\\51homework\\Atm\\bin\\atm.py'  #是从D盘的这个根目录下来的

2、相对路径

相对路径:从一个目录为起点到你所在的目录。

>>> import os

>>> os.chdir("D:\\PycharmProjects\\51homework\\Atm\\bin\\")

>>> os.listdir()

['atm.py', '__init__.py']

>>> os.path.dirname('atm.py')

''  #显示相对路径

四、不同目录间进行模块调用

1、添加环境变量

一般情况下,绝对路径函数和相对路径函数是结合起来用的,特别是在不同目录之间相互调用彼此的模块。

Python不同目录间进行模块调用的实现方法

比如按以上层级:atm.py如果想调用其他模块中的代码,必须要跟atm.py是同级的,不信请看如下代码:

#atm.py中的代码

import sys

print(sys.path)

#cmd执行的结果

D:\PycharmProjects\51homework>python Atm/bin/atm.py

['D:\\PycharmProjects\\51homework\\Atm\\bin', 'D:\\Python\\Python35\\python35.zip',

 'D:\\Python\\Python35\\DLLs', 'D:\\Python\\Python35\\lib', 'D:\\Python\\Python35', 

'D:\\Python\\Python35\\lib\\site-packages']

只到'D:\\PycharmProjects\\51homework\\Atm\\bin'这一层,其他的层级无法调用。那怎么办呐?

步骤如下:

1.获取Atm的绝对路径
2.添加到环境变量中

代码如下:

#atm.py中的代码
import os,sys
BASE_DIR = os.path.dirname( os.path.dirname( os.path.abspath(__file__) ) ) #Atm的绝对路径
print(BASE_DIR)
sys.path.append(BASE_DIR) #添加到环境变量中
#cmd执行结果
D:\PycharmProjects\51homework>python Atm/bin/atm.py  #执行atm.py文件
D:\PycharmProjects\51homework\Atm  #打印Atm的绝对路径
['D:\\PycharmProjects\\51homework\\Atm\\bin', 'D:\\Python\\Python35\\python35.zip', 
'D:\\Python\\Python35\\DLLs', 'D:\\Python\\Python35\\lib', 'D:\\Python\\Python35',
 'D:\\Python\\Python35\\lib\\site-packages',
 'D:\\PycharmProjects\\51homework\\Atm']  #Atm的绝对路径已经添加到环境变量中

2、调用其他模块

接下来就可以顺利的进行不同目录下,模块之间的调用了

#atm.py中的代码
import os,sys
BASE_DIR = os.path.dirname( os.path.dirname( os.path.abspath(__file__) ) )
sys.path.append(BASE_DIR)
from core import main  #调用core中的main模块
main.sayhi()  #调用main模块中sayhi函数
 
#main.py中代码
def sayhi():
  print("hello word")
 
#cmd执行的结果
D:\PycharmProjects\51homework>python Atm/bin/atm.py
hello word

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python获取Linux系统下的本机IP地址代码分享
Nov 07 Python
深入浅析Python字符编码
Nov 12 Python
浅谈Python数据类型判断及列表脚本操作
Nov 04 Python
python爬取w3shcool的JQuery课程并且保存到本地
Apr 06 Python
分享6个隐藏的python功能
Dec 07 Python
Python语言描述连续子数组的最大和
Jan 04 Python
利用python画出折线图
Jul 26 Python
python实现网站用户名密码自动登录功能
Aug 09 Python
Python上下文管理器用法及实例解析
Nov 11 Python
解决pycharm上的jupyter notebook端口被占用问题
Dec 17 Python
Django:使用filter的pk进行多值查询操作
Jul 15 Python
PyQt5爬取12306车票信息程序的实现
May 14 Python
DataFrame:通过SparkSql将scala类转为DataFrame的方法
Jan 29 #Python
pandas去除重复列的实现方法
Jan 29 #Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
Jan 29 #Python
pandas去重复行并分类汇总的实现方法
Jan 29 #Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
Jan 29 #Python
Python使用ctypes调用C/C++的方法
Jan 29 #Python
dataframe 按条件替换某一列中的值方法
Jan 29 #Python
You might like
PHP时间戳 strtotime()使用方法和技巧
2013/10/29 PHP
PHP 实现类似js中alert() 提示框
2015/03/18 PHP
PHP实现通过Luhn算法校验信用卡卡号是否有效
2015/03/23 PHP
新浪微博OAuth认证和储存的主要过程详解
2015/03/27 PHP
php发送短信验证码完成注册功能
2015/11/24 PHP
YII使用url组件美化管理的方法
2015/12/28 PHP
浅析php如何实现爬取数据原理
2018/09/27 PHP
javascript 面向对象编程基础 多态
2009/08/21 Javascript
ExtJs使用IFrame的实现代码
2010/03/24 Javascript
JavaScript 垃圾回收机制分析
2013/10/10 Javascript
浅谈javascript中的instanceof和typeof
2015/02/27 Javascript
JavaScript实现节点的删除与序号重建实例
2015/08/05 Javascript
浅析JS异步加载进度条
2016/05/05 Javascript
Node.js读写文件之批量替换图片的实现方法
2016/09/07 Javascript
javascript自定义事件功能与用法实例分析
2017/11/08 Javascript
VUE实现可随意拖动的弹窗组件
2018/09/25 Javascript
JavaScript工具库之Lodash详解
2019/06/15 Javascript
在NodeJs中使用node-schedule增加定时器任务的方法
2020/06/08 NodeJs
openlayers4实现点动态扩散
2020/08/17 Javascript
pyside写ui界面入门示例
2014/01/22 Python
python实现简单温度转换的方法
2015/03/13 Python
Python OpenCV处理图像之滤镜和图像运算
2018/07/10 Python
python数据结构之线性表的顺序存储结构
2018/09/28 Python
python 绘制正态曲线的示例
2020/09/24 Python
全球知名的婚恋交友网站:Match.com
2017/01/05 全球购物
英国香水店:The Perfume Shop
2017/03/27 全球购物
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
C++:memset ,memcpy和strcpy的根本区别
2013/04/27 面试题
Linux文件系统类型
2012/02/15 面试题
态度决定一切演讲稿
2014/05/20 职场文书
会议欢迎标语
2014/06/30 职场文书
校园新闻稿范文
2015/07/18 职场文书
2019最新婚庆对联集锦!
2019/07/10 职场文书
MySQL 百万级数据的4种查询优化方式
2021/06/07 MySQL
Mysql InnoDB 的内存逻辑架构
2022/05/06 MySQL
python热力图实现的完整实例
2022/06/25 Python