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模块restful使用方法实例
Dec 10 Python
Python返回真假值(True or False)小技巧
Apr 10 Python
Python的Flask框架中的Jinja2模板引擎学习教程
Jun 30 Python
Django应用程序中如何发送电子邮件详解
Feb 04 Python
Python编程实现数学运算求一元二次方程的实根算法示例
Apr 02 Python
Python创建对称矩阵的方法示例【基于numpy模块】
Oct 12 Python
pandas中Timestamp类用法详解
Dec 11 Python
Python3.5面向对象与继承图文实例详解
Apr 24 Python
Django实现发送邮件找回密码功能
Aug 12 Python
Python Opencv提取图片中某种颜色组成的图形的方法
Sep 19 Python
Pytorch实现WGAN用于动漫头像生成
Mar 04 Python
python中__slots__节约内存的具体做法
Jul 04 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导出CSV抽象类实例
2014/09/24 PHP
php中adodbzip类实例
2014/12/08 PHP
Redis使用Eval多个键值自增的操作实例
2016/11/04 PHP
window.parent调用父框架时 ie跟火狐不兼容问题
2009/07/30 Javascript
使用Jquery来实现可以输入值的下拉选单 雏型
2011/12/06 Javascript
jQuery插件开发全解析
2012/10/10 Javascript
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
javascript中with()方法的语法格式及使用
2014/08/04 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
2014/10/21 Javascript
js实现鼠标触发图片抖动效果的方法
2015/02/27 Javascript
jQuery模拟原生态App上拉刷新下拉加载更多页面及原理
2015/08/10 Javascript
jQuery实现左侧导航模块的显示与隐藏效果
2016/07/04 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
2016/11/28 Javascript
微信小程序 ecshop地址三级联动实现实例代码
2017/02/28 Javascript
初探JavaScript 面向对象(推荐)
2017/09/03 Javascript
vue2手机APP项目添加开屏广告或者闪屏广告
2017/11/28 Javascript
JS实现的简单折叠展开动画效果示例
2018/04/28 Javascript
Vue不能观察到数组length的变化
2018/06/08 Javascript
vue之组件内监控$store中定义变量的变化详解
2019/11/08 Javascript
微信小程序实现点击页面出现文字
2020/09/21 Javascript
[01:11:02]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
django之session与分页(实例讲解)
2017/11/13 Python
python实现kMeans算法
2017/12/21 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
2018/12/03 Python
python判断一个数是否能被另一个整数整除的实例
2018/12/12 Python
Python面向对象思想与应用入门教程【类与对象】
2019/04/12 Python
python2.7 安装pip的方法步骤(管用)
2019/05/05 Python
Python selenium键盘鼠标事件实现过程详解
2020/07/28 Python
Python实现七个基本算法的实例代码
2020/10/08 Python
python实现一个简单RPC框架的示例
2020/10/28 Python
2015年度电厂个人工作总结
2015/05/13 职场文书
行政处罚告知书
2015/07/01 职场文书
2016应届毕业生自荐信范文
2016/01/28 职场文书
关于应聘教师的自荐信
2016/01/28 职场文书
Java中CyclicBarrier和CountDownLatch的用法与区别
2021/08/23 Java/Android