本节内容
1、背景
2、函数功能解释
3、绝对路径和相对路径
4、不同目录间进行模块调用
一、背景
之前写了软件开发目录规范这篇博客,相信很多人都已经知道,我们在写程序时需要遵循一定的规范,不然,就算很简答的逻辑程序的代码,读起来会很费劲,占用了我们大量的时间,但是,我们一旦用了这样的规范目录,我们怎么去愉快的进行模块之前的相互导入呢?这就不得不说我们今天讨论的两个概念:绝对路径和相对路径。
二、函数功能解释
1、__file__
功能:返回自身文件的相对路径
1
2
3
4
5
6
7
8
9
10
|
#atm.py中的代码 print (__file__) #pycharm的执行结果 D:PythonPython35python.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.abs()
功能:返回自身文件的绝对路径
1
2
3
4
5
6
|
#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()
功能:返回目录名,不需要文件名
1
2
3
4
5
6
|
#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 #只返回目录名,不需要文件名 |
4、sys.path
功能:python环境的执行的环境变量
1
2
3
4
5
6
7
8
|
#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数据类型是一个列表。
三、绝对路径和相对路径
1、绝对路径
绝对路径:从根目录为起点到你所在的目录。
1
2
3
4
5
6
|
>>> 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、相对路径
相对路径:从一个目录为起点到你所在的目录。
1
2
3
4
5
6
|
>>> import os >>> os.chdir( "D:\PycharmProjects\51homework\Atm\bin\" ) >>> os.listdir() [ 'atm.py' , '__init__.py' ] >>> os.path.dirname( 'atm.py' ) '' #显示相对路径 |
四、不同目录间进行模块调用
1、添加环境变量
一般情况下,绝对路劲函数和相对路径函数是结合起来用的,特别是在不同目录之间相互调用彼此的模块。
比如按以上层级:atm.py如果想调用其他模块中的代码,必须要跟atm.py是同级的,不信请看如下代码:
1
2
3
4
5
6
7
8
|
#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的绝对路径
- 添加到环境变量中
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#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的绝对路径已经添加到环境变量中 |
2、调用其他模块
接下来就可以顺利的进行不同目录下,模块之间的调用了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#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 |