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 代码优化详解
Oct 27 Python
Python列表(list)、字典(dict)、字符串(string)基本操作小结
Nov 28 Python
python实现爬虫统计学校BBS男女比例(一)
Dec 31 Python
Python实现简单多线程任务队列
Feb 27 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
Apr 15 Python
对Python中画图时候的线类型详解
Jul 07 Python
使用Python快乐学数学Github万星神器Manim简介
Aug 07 Python
Python流程控制 if else实现解析
Sep 02 Python
python函数enumerate,operator和Counter使用技巧实例小结
Feb 22 Python
jupyter 中文乱码设置编码格式 避免控制台输出的解决
Apr 20 Python
Django+RestFramework API接口及接口文档并返回json数据操作
Jul 12 Python
python线程里哪种模块比较适合
Aug 02 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使之能同时支持GIF和JPEG
2006/10/09 PHP
PHP 和 MySQL 基础教程(四)
2006/10/09 PHP
在PHP模板引擎smarty生成随机数的方法和math函数详解
2014/04/24 PHP
javascript 写类方式之二
2009/07/05 Javascript
JavaScript判断密码强度(自写代码)
2013/09/06 Javascript
jquery实现div阴影效果示例代码
2013/09/16 Javascript
利用JS解决ie6不支持max-width,max-height问题的方法
2014/01/02 Javascript
Express下采用bcryptjs进行密码加密的方法
2018/02/07 Javascript
JQuery样式操作、click事件以及索引值-选项卡应用示例
2019/05/14 jQuery
vue+element实现表单校验功能
2019/05/20 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
在vue中利用v-html按分号将文本换行的例子
2019/11/14 Javascript
详解vue 组件的实现原理
2020/11/12 Javascript
[17:00]DOTA2 HEROS教学视频教你分分钟做大人-帕克
2014/06/10 DOTA
python绘制简单折线图代码示例
2017/12/19 Python
python通过Windows下远程控制Linux系统
2018/06/20 Python
基于Django框架利用Ajax实现点赞功能实例代码
2018/08/19 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
浅析Python 读取图像文件的性能对比
2019/03/07 Python
如何更优雅地写python代码
2019/07/02 Python
利用CSS3伪元素实现逐渐发光的方格边框
2017/05/07 HTML / CSS
HTML5实现Notification API桌面通知功能
2016/03/02 HTML / CSS
html5通过canvas实现刮刮卡效果示例分享
2014/01/27 HTML / CSS
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
Piercing Pagoda官网:耳环、戒指、项链、手链等
2020/09/28 全球购物
指针和引用有什么区别
2013/01/13 面试题
光声世纪笔试题目
2012/08/25 面试题
建筑工程专业毕业生自荐信
2013/10/19 职场文书
旅游与酒店管理的自我评价分享
2013/11/03 职场文书
优秀德育工作者事迹材料
2014/05/07 职场文书
教师民族团结演讲稿
2014/08/27 职场文书
开幕式邀请函
2015/01/31 职场文书
幼儿园大班教育随笔
2015/08/14 职场文书
优秀党员主要事迹材料
2015/11/04 职场文书
MySQL为id选择合适的数据类型
2021/06/07 MySQL
SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)
2023/05/08 MySQL