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使用xauth方式登录饭否网然后发消息
Apr 11 Python
pymongo为mongodb数据库添加索引的方法
May 11 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
Nov 29 Python
Python的numpy库中将矩阵转换为列表等函数的方法
Apr 04 Python
解决python写入mysql中datetime类型遇到的问题
Jun 21 Python
理想高通滤波实现Python opencv示例
Jan 30 Python
Python 通过打码平台实现验证码的实现
May 13 Python
PyTorch的深度学习入门教程之构建神经网络
Jun 27 Python
Pygame框架实现飞机大战
Aug 07 Python
Django自带的用户验证系统实现
Dec 18 Python
python 如何执行控制台命令与操作剪切板
May 20 Python
Python 阶乘详解
Oct 05 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
Smarty Foreach 使用说明
2010/03/23 PHP
ThinkPHP模版引擎之变量输出详解
2014/12/05 PHP
php实现的生成迷宫与迷宫寻址算法完整实例
2017/11/06 PHP
laravel 实现向公共模板中传值 (view composer)
2019/10/22 PHP
IE6下出现JavaScript未结束的字符串常量错误的解决方法
2010/11/21 Javascript
javascript中将Object转换为String函数代码 (json str)
2012/04/29 Javascript
JS判断页面加载状态以及添加遮罩和缓冲动画的代码
2012/10/11 Javascript
js操作table示例(个人心得)
2013/11/29 Javascript
jquery ajax 局部刷新小案例
2014/02/08 Javascript
Javascript异步编程模型Promise模式详细介绍
2014/05/08 Javascript
JS替换字符串中空格方法
2015/04/17 Javascript
jquery实现简单的自动播放幻灯片效果
2015/06/13 Javascript
jquery.gridrotator实现响应式图片展示画廊效果
2015/06/23 Javascript
JS中innerHTML和pasteHTML的区别实例分析
2016/06/22 Javascript
JS 中document.write()的用法和清空的原因浅析
2017/12/04 Javascript
webpack打包node.js后端项目的方法
2018/03/10 Javascript
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
2018/09/18 Javascript
Angular实现svg和png图片下载实现
2019/05/05 Javascript
使用Vant完成DatetimePicker 日期的选择器操作
2020/11/12 Javascript
[01:22:28]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第一场 1月18日
2021/03/11 DOTA
Python开发常用的一些开源Package分享
2015/02/14 Python
Python中使用第三方库xlrd来写入Excel文件示例
2015/04/05 Python
python自动zip压缩目录的方法
2015/06/28 Python
Python中django学习心得
2017/12/06 Python
python日志logging模块使用方法分析
2019/05/23 Python
详解python破解zip文件密码的方法
2020/01/13 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
2020/03/12 Python
使用Python和百度语音识别生成视频字幕的实现
2020/04/09 Python
美国网上眼镜商城:Zenni Optical
2016/11/20 全球购物
外贸业务员岗位职责
2013/11/24 职场文书
《珍珠泉》教学反思
2014/02/20 职场文书
小学生春游活动方案
2014/08/20 职场文书
2015年新农村建设工作总结
2015/05/22 职场文书
美德少年主要事迹材料
2015/11/04 职场文书
创业计划书之密室逃脱
2019/11/08 职场文书
一篇文章学会Vue中间件管道
2021/06/20 Vue.js