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爬虫包BeautifulSoup学习实例(五)
Jun 17 Python
python面试题Python2.x和Python3.x的区别
May 28 Python
python2和python3在处理字符串上的区别详解
May 29 Python
pytorch神经网络之卷积层与全连接层参数的设置方法
Aug 18 Python
python元组和字典的内建函数实例详解
Oct 22 Python
Python利用逻辑回归模型解决MNIST手写数字识别问题详解
Jan 14 Python
利用 Python ElementTree 生成 xml的实例
Mar 06 Python
python datetime处理时间小结
Apr 16 Python
Python中使用filter过滤列表的一个小技巧分享
May 02 Python
Django集成MongoDB实现过程解析
Dec 01 Python
教你使用一行Python代码玩遍童年的小游戏
Aug 23 Python
python turtle绘图命令及案例
Nov 23 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实现的策略模式简单示例
2017/08/25 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
php常用日期时间函数实例小结
2019/07/04 PHP
类似GMAIL的Ajax信息反馈显示
2010/02/16 Javascript
js两行代码按指定格式输出日期时间
2011/10/21 Javascript
json的结构与遍历方法实例分析
2017/04/25 Javascript
Vue-Router实现组件间跳转的三种方法
2017/11/07 Javascript
Angular6封装http请求的步骤详解
2018/08/13 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
为什么JavaScript中0.1 + 0.2 != 0.3
2020/12/03 Javascript
vue 递归组件的简单使用示例
2021/01/14 Vue.js
在Python中使用Neo4j数据库的教程
2015/04/16 Python
python+Django+apache的配置方法详解
2016/06/01 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
2018/07/11 Python
Python的Tkinter点击按钮触发事件的例子
2019/07/19 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2019/08/21 Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
2020/02/11 Python
用python介绍4种常用的单链表翻转的方法小结
2020/02/24 Python
python实现横向拼接图片
2020/03/23 Python
keras 权重保存和权重载入方式
2020/05/21 Python
Python3爬虫中Selenium的用法详解
2020/07/10 Python
Python中的With语句的使用及原理
2020/07/29 Python
Python如何急速下载第三方库详解
2020/11/02 Python
英国足球店:UK Soccer Shop
2017/11/19 全球购物
美国最大的半成品净菜电商:Blue Apron(蓝围裙)
2018/04/27 全球购物
Nike挪威官网:Nike.com (NO)
2018/11/26 全球购物
办公文员的工作岗位职责
2013/11/12 职场文书
作文评语大全
2014/04/23 职场文书
电力培训心得体会
2014/09/02 职场文书
学生党员检讨书范文
2014/12/27 职场文书
三潭印月的导游词
2015/02/12 职场文书
实习生辞职信范文
2015/03/02 职场文书
2015应届毕业生求职信范文
2015/03/20 职场文书
学习雷锋主题班会
2015/08/14 职场文书
2016年9月份红领巾广播稿
2015/12/21 职场文书
Go web入门Go pongo2模板引擎
2022/05/20 Golang