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实现拉钩网上的FizzBuzzWhizz问题示例
May 05 Python
python基于xml parse实现解析cdatasection数据
Sep 30 Python
Python中的两个内置模块介绍
Apr 05 Python
python常见数制转换实例分析
May 09 Python
Python 的描述符 descriptor详解
Feb 27 Python
利用numpy实现一、二维数组的拼接简单代码示例
Dec 15 Python
对dataframe进行列相加,行相加的实例
Jun 08 Python
numpy.linspace 生成等差数组的方法
Jul 02 Python
浅谈python函数调用返回两个或多个变量的方法
Jan 23 Python
Django框架验证码用法实例分析
May 10 Python
python3 enum模块的应用实例详解
Aug 12 Python
python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例
Feb 28 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
全国FM电台频率大全 - 5 内蒙古自治区
2020/03/11 无线电
使用MaxMind 根据IP地址对访问者定位
2006/10/09 PHP
解析php中heredoc的使用方法
2013/06/17 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
2017/01/12 PHP
PHP基于DOM创建xml文档的方法示例
2017/02/08 PHP
Yii2 如何在modules中添加验证码的方法
2017/06/19 PHP
繁简字转换功能
2006/07/19 Javascript
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
2006/11/30 Javascript
javascript 文档的编码问题解决
2009/03/01 Javascript
在VS2008中使用jQuery智能感应的方法
2010/12/30 Javascript
AngularJS基础 ng-if 指令用法
2016/08/01 Javascript
微信小程序 传值取值的几种方法总结
2017/01/16 Javascript
Vue组件通信之Bus的具体使用
2017/12/28 Javascript
小程序自定义组件实现城市选择功能
2018/07/18 Javascript
vue项目设置scrollTop不起作用(总结)
2018/12/21 Javascript
vue实现文字加密功能
2019/09/27 Javascript
微信小程序实现分享商品海报功能
2019/09/30 Javascript
实例讲解Python的函数闭包使用中应注意的问题
2016/06/20 Python
Python内置函数——__import__ 的使用方法
2017/11/24 Python
python删除某个字符
2018/03/19 Python
python和opencv实现抠图
2018/07/18 Python
如何基于Python实现电子邮件的发送
2019/12/16 Python
Python文本文件的合并操作方法代码实例
2020/03/31 Python
Scrapy框架介绍之Puppeteer渲染的使用
2020/06/19 Python
Python 实现键盘鼠标按键模拟
2020/11/18 Python
CSS3常用的几种颜色渐变模式总结
2016/11/18 HTML / CSS
CSS3 创建网页动画实现弹跳球动效果
2018/10/30 HTML / CSS
计算机操作自荐信
2013/12/07 职场文书
群众路线教育实践活动方案
2014/02/02 职场文书
酒店端午节促销方案
2014/02/18 职场文书
外贸专业求职信
2014/03/09 职场文书
企业指导教师评语
2014/04/28 职场文书
假面舞会策划方案
2014/05/29 职场文书
党员四风问题对照检查材料
2014/09/27 职场文书
新郎父母婚礼答谢词
2015/09/29 职场文书
奶茶店的创业计划书该怎么写?
2019/07/15 职场文书