以前写了软件开发目录规范这篇博客,相信不少人都已经知道,咱们在写程序时须要遵循必定的规范,否则,就算很简答的逻辑程序的代码,读起来会很费劲,占用了咱们大量的时间,可是,咱们一旦用了这样的规范目录,咱们怎么去愉快的进行模块以前的相互导入呢?这就不得不说咱们今天讨论的两个概念:绝对路径和相对路径。python
一、__file__app
功能:返回自身文件的相对路径函数
#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__表示的是相对路径,因此在哪一个路径下,就打印哪一个路径。spa
二、os.path.abs()code
功能:返回自身文件的绝对路径blog
#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的绝对路径
三、os.path.dirname()ip
功能:返回目录名,不须要文件名开发
#atm.py的文件代码 import os print(os.path.dirname( os.path.abspath(__file__) )) #在cmd中的执行结果 D:\PycharmProjects\51homework>python Atm/bin/atm.py D:\PycharmProjects\51homework\Atm\bin #只返回目录名,不须要文件名
四、sys.pathpycharm
功能:python环境的执行的环境变量cmd
#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']
注:执行路径是列表的形式打印出来的,因此sys.path数据类型是一个列表。
一、绝对路径
绝对路径:从根目录为起点到你所在的目录。
>>> 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盘的这个根目录下来的
二、相对路径
相对路径:从一个目录为起点到你所在的目录。
>>> import os >>> os.chdir("D:\\PycharmProjects\\51homework\\Atm\\bin\\") >>> os.listdir() ['atm.py', '__init__.py'] >>> os.path.dirname('atm.py') '' #显示相对路径
一、添加环境变量
通常状况下,绝对路劲函数和相对路径函数是结合起来用的,特别是在不一样目录之间相互调用彼此的模块。
好比按以上层级: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'这一层,其余的层级没法调用。那怎么办呐?
步骤以下:
代码以下:
#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) #添加到环境变量中 print(sys.path) #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的绝对路径已经添加到环境变量中
二、调用其余模块
接下来就能够顺利的进行不一样目录下,模块之间的调用了
#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