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的requests网络编程包使用教程
Jul 11 Python
python中print的不换行即时输出的快速解决方法
Jul 20 Python
python字符串,数值计算
Oct 05 Python
Python 基础知识之字符串处理
Jan 06 Python
Python中第三方库Requests库的高级用法详解
Mar 12 Python
Python 列表理解及使用方法
Oct 27 Python
详解Python中的type和object
Aug 15 Python
Python实现随机创建电话号码的方法示例
Dec 07 Python
Python:slice与indices的用法
Nov 25 Python
在spyder IPython console中,运行代码加入参数的实例
Apr 20 Python
Python 如何测试文件是否存在
Jul 31 Python
Selenium Webdriver元素定位的八种常用方式(小结)
Jan 13 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对gzip文件或者字符串解压实例参考
2008/07/25 PHP
php比较两个绝对时间的大小
2014/01/31 PHP
PHP实现递归无限级分类
2015/10/22 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
2019/09/16 PHP
将HTML自动转为JS代码
2006/06/26 Javascript
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
2006/12/22 Javascript
模拟jQuery ajax服务器端与客户端通信的代码
2011/03/28 Javascript
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
javascript实现div的显示和隐藏的小例子
2013/06/25 Javascript
Javascript的表单验证-初识正则表达式
2016/03/18 Javascript
node.js连接mongoDB数据库 快速搭建自己的web服务
2016/04/17 Javascript
Bootstrap3 多个模态对话框无法显示的解决方案
2017/02/23 Javascript
jquery实现左右滑动式轮播图
2017/03/02 Javascript
剖析Angular Component的源码示例
2018/03/23 Javascript
Vue 项目代理设置的优化
2018/04/17 Javascript
json字符串传到前台input的方法
2018/08/06 Javascript
解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题
2018/08/30 Javascript
脚手架vue-cli工程webpack的作用和特点
2018/09/29 Javascript
微信运维交互机器人的示例代码
2018/11/12 Javascript
微信公众号H5支付接口调用方法
2019/01/10 Javascript
图解JS原型和原型链实现原理
2020/09/15 Javascript
用Python进行一些简单的自然语言处理的教程
2015/03/31 Python
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
详解Python中的__new__、__init__、__call__三个特殊方法
2016/06/02 Python
python操作 hbase 数据的方法
2016/12/18 Python
Python 读取指定文件夹下的所有图像方法
2018/04/27 Python
Python使用sorted对字典的key或value排序
2018/11/15 Python
Python简单获取二维数组行列数的方法示例
2018/12/21 Python
Python拼接字符串的7种方式详解
2020/03/19 Python
python中id函数运行方式
2020/07/03 Python
python爬虫爬取图片的简单代码
2021/01/18 Python
实习计划书范文
2015/01/16 职场文书
护士年终个人总结
2015/02/13 职场文书
宿舍卫生管理制度
2015/08/05 职场文书
2019年怎样写好导游词?
2019/07/02 职场文书
解决vue $http的get和post请求跨域问题
2021/06/07 Vue.js