Python学习【第十一篇】不同目录间模块的调用

本人最近在学python,参考了以下链接中博主的一系列文章,并转载学习,希望对正在学习python的你有所帮助。

关于这部分,在博文http://www.cnblogs.com/linupython/p/7736816.html有详细的说明,楼主较懒,就不重复实现了,以下内容转载自该文章。

1.前言

上文已经讲述了软件项目开发目录规范的若干事项,现在问题来了,我们遵循了项目目录设计规范,不同目录下设计了不同的函数和模块,怎么实现对这些模块的调用,使其为项目整体所用呢?本章节讲述的绝对路径与相对路径,以及不同目录间模块如何调用将回答这个问题。

2.重要功能函数

1. __file__

功能:返回文件自身所在的路径。
请注意我们我们一般通过print(__file__)来返回获得当前文件所在的路径,但是不能直接在命令行下以交互的方式来使用它,必须定义在一个保存好的py文件中后去执行它。
这里写图片描述
命令行下直接使用print(file)会报错

另外这里的路径究竟是绝对路径还是相对路径呢?答案是两个都不是,取决于执行时传递给python的文件形式,如果以相对路径的形式传递给python执行,那么就返回相对路径,反之则返回绝对路径。

#  D:/python/S13/Day5/test/bin/test.py 代码
print(__file__)


# Pycharm执行结果
"C:\Program Files (x86)\python3.6.1\python.exe" D:/python/S13/Day5/test/bin/test.py
D:/python/S13/Day5/test/bin/test.py

# CMD执行结果
D:\python\S13\Day5\test\bin>python D:/python/S13/Day5/test/bin/test.py  #在文件所在路径下以绝对路径方式传入文件,返回的仍然是绝对路径
D:/python/S13/Day5/test/bin/test.py
D:\python\S13\Day5\test\bin>cd ..
D:\python\S13\Day5\test>python D:/python/S13/Day5/test/bin/test.py
D:/python/S13/Day5/test/bin/test.py
D:\python\S13\Day5\test>cd ..
D:\python\S13\Day5>python test/bin/test.py #只有以相对路径形式传入文件,才能返回相对路径
test/bin/test.py
2. os.path.dirname(file)

功能:返回给定参数文件所在的目录(路径)。

注意返回的路径是相对路径还是绝对路径取决于传递的参数形式,如果以绝对路径形式传入参数文件,则返回绝对路径,反之则返回相对路径

>>> print(os.path.abspath('.'))
D:\python\S13\Day5
>>> print(os.path.dirname('test/bin/test.py'))
test/bin
>>> print(os.path.dirname('D:/python/S13/Day5/test/bin/test.py'))
D:/python/S13/Day5/test/bin

#Pycharm中执行结果相同
#D:/python/S13/Day5/test/bin/test.py代码
import os
print(os.path.dirname(os.path.abspath(__file__)))

#执行结果
"C:\Program Files (x86)\python3.6.1\python.exe" D:/python/S13/Day5/test/bin/test.py
D:\python\S13\Day5\test\bin
3. os.path.abspath(file)

功能:返回文件对象的绝对路径(包含文件本身在内)

#test.py代码
import os
print(os.path.abspath(__file__))

#cmd下执行结果
D:\python\S13>python day5/test/bin/test.py
D:\python\S13\day5\test\bin\test.py
4. sys.path

功能:返回python当前可执行的环境变量

import sys
print(sys.path)

D:\python\S13>python day5/test/bin/test.py
['D:\\python\\S13\\day5\\test\\bin', 'C:\\Program Files (x86)\\python3.6.1\\pyth
on36.zip', 'C:\\Program Files (x86)\\python3.6.1\\DLLs', 'C:\\Program Files (x86
)\\python3.6.1\\lib', 'C:\\Program Files (x86)\\python3.6.1', 'C:\\Program Files
 (x86)\\python3.6.1\\lib\\site-packages']

3. 绝对路径与相对路径

  • 绝对路径
    绝对路径是相当于根目录而言描述了文件对象完整的路径,在任何路径下通过绝对路径一定可以找到该文件。
>>> import os
>>> os.chdir('D:\\python\\S13\\Day5\\test\\bin')
>>> os.listdir()
['test.py']
>>> os.path.abspath('test.py')
'D:\\python\\S13\\Day5\\test\\bin\\test.py'
>>>
  • 相对路径
    相对路径是相对于一个特定的非根目录而言来描述文件的路劲的,只有在该指定的参考文件目录下通过相对路径才可以访问到该文件。
>>> import os
>>> os.chdir('D:\\python\\S13\\Day5')
>>> os.path.dirname('test/bin/test.py')
'test/bin'  # 返回的路径是相对于当前所在目录而言的非完整路径

4. 不同目录间模块如何调用

有了以上基础知识的铺垫,就可以实现不同目录间模块的调用了,其实现的思路是先通过上述多个函数把项目根目录获取到,然后追加到系统环境变量中,最后from不同路径import模块。

为什么要先解决系统环境变量问题呢?这是因为相对于项目而言,默认的PATH只深入到被执行的python文件所在的目录这一层。

#test.py代码
import sys
print(sys.path)
D:\python\S13>python D:\python\S13\Day5\test\bin\test.py
   ['D:\\python\\S13\\Day5\\test\\bin', 'C:\\Program Files (x86)\\python3.6.1\\pyth
   on36.zip', 'C:\\Program Files (x86)\\python3.6.1\\DLLs', 'C:\\Program Files (x86
   )\\python3.6.1\\lib', 'C:\\Program Files (x86)\\python3.6.1', 'C:\\Program Files
    (x86)\\python3.6.1\\lib\\site-packages']
#请注意返回的PATH中,只有列表的第一个元素跟项目本身有关,而且只深入到test.py所在的这一层目录,其它的元素均为python自身默认的环境变量

因此只能从sys.path返回的列表第一个元素上着手,把项目的根目录追加到PATH中,这样才能方便调用项目中任何目录下的模块。
下面通过一个直观的栗子来实践一下。

先截图说明下项目目录结构:
这里写图片描述
项目的根目录是test这一级,假设test.py是我的入口文件。

test.py代码如下:

import os,sys


BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #这里先通过os.path.abspath获取入口文件所在的绝对路径,然后通过两次调用os.path.dirname函数获取到项目根目录
sys.path.append(BASE_DIR) #把系统根目录追加到环境变量中

from conf import settings
settings.check_path()

from core import main
main.sayhi()

conf/settings.py代码如下,用于检测环境变量是否正确:

import os,sys

SYS_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

def check_path():
    print("Let's begin to check the current PATH")
    if SYS_PATH in sys.path:
        print('Check PATH OK!')
    else:
        exit('Check PATH error,the program is exiting...')

core/main.py包含了需要执行的主要功能模块,代码如下:

def sayhi():
    print('Hello world!')

执行test.py的结果如下:

"C:\Program Files (x86)\python3.6.1\python.exe" D:/python/S13/Day5/test/bin/test.py
Let's begin to check the current PATH
Check PATH OK!
Hello world!

可以看到我们获得了预期的效果,成功实现了对其他目录下模块的调用。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值