1.前言

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

2.重要功能函数

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

    命令行下直接使用print(__file__)报错了!

    另外这里的路径究竟是绝对路径还是相对路径呢?答案是两个都不是,取决于执行时传递给python的文件形式,如果以相对路径的形式传递给python执行,那么就返回相对路径,反之则返回绝对路径。
      1 #  D:/python/S13/Day5/test/bin/test.py 代码
    2 print(__file__)
    3
    4
    5 # Pycharm执行结果
    6 "C:\Program Files (x86)\python3.6.1\python.exe" D:/python/S13/Day5/test/bin/test.py
    7 D:/python/S13/Day5/test/bin/test.py
    8
    9 # CMD执行结果
    10 D:\python\S13\Day5\test\bin>python D:/python/S13/Day5/test/bin/test.py #在文件所在路径下以绝对路径方式传入文件,返回的仍然是绝对路径
    11 D:/python/S13/Day5/test/bin/test.py
    12 D:\python\S13\Day5\test\bin>cd ..
    13 D:\python\S13\Day5\test>python D:/python/S13/Day5/test/bin/test.py
    14 D:/python/S13/Day5/test/bin/test.py
    15 D:\python\S13\Day5\test>cd ..
    16 D:\python\S13\Day5>python test/bin/test.py #只有以相对路径形式传入文件,才能返回相对路径
    17 test/bin/test.py
  2. os.path.dirname(file)
    功能:返回给定参数文件所在的目录(路径)。
    注意返回的路径是相对路径还是绝对路径取决于传递的参数形式,如果以绝对路径形式传入参数文件,则返回绝对路径,反之则返回相对路径
      1 >>> print(os.path.abspath('.'))
    2 D:\python\S13\Day5
    3 >>> print(os.path.dirname('test/bin/test.py'))
    4 test/bin
    5 >>> print(os.path.dirname('D:/python/S13/Day5/test/bin/test.py'))
    6 D:/python/S13/Day5/test/bin
    7
    8 #Pycharm中执行结果相同
    9 #D:/python/S13/Day5/test/bin/test.py代码
    10 import os
    11 print(os.path.dirname(os.path.abspath(__file__)))
    12
    13 #执行结果
    14 "C:\Program Files (x86)\python3.6.1\python.exe" D:/python/S13/Day5/test/bin/test.py
    15 D:\python\S13\Day5\test\bin
    16
  3. os.path.abspath(file)
    功能:返回文件对象的绝对路径(包含文件本身在内)

      1 #test.py代码
    2 import os
    3 print(os.path.abspath(__file__))
    4
    5 #cmd下执行结果
    6 D:\python\S13>python day5/test/bin/test.py
    7 D:\python\S13\day5\test\bin\test.py
  4. sys.path
    功能:返回python当前可执行的环境变量
      1 import sys
    2 print(sys.path)
    3
    4 D:\python\S13>python day5/test/bin/test.py
    5 ['D:\\python\\S13\\day5\\test\\bin', 'C:\\Program Files (x86)\\python3.6.1\\pyth
    6 on36.zip', 'C:\\Program Files (x86)\\python3.6.1\\DLLs', 'C:\\Program Files (x86
    7 )\\python3.6.1\\lib', 'C:\\Program Files (x86)\\python3.6.1', 'C:\\Program Files
    8 (x86)\\python3.6.1\\lib\\site-packages']
    9

3. 绝对路径与相对路径

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

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

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

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

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

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

先截图说明下项目目录结构:


项目的根目录是test这一级,假设test.py是我的入口文件。

test.py代码如下:

  1 import os,sys
2
3
4 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #这里先通过os.path.abspath获取入口文件所在的绝对路径,然后通过两次调用os.path.dirname函数获取到项目根目录
5 sys.path.append(BASE_DIR) #把系统根目录追加到环境变量中
6
7 from conf import settings
8 settings.check_path()
9
10 from core import main
11 main.sayhi()

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

  1 import os,sys
2
3 SYS_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
4
5 def check_path():
6 print("Let's begin to check the current PATH")
7 if SYS_PATH in sys.path:
8 print('Check PATH OK!')
9 else:
10 exit('Check PATH error,the program is exiting...')

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

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

执行test.py的结果如下:

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

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

day4-不同目录间模块的调用的更多相关文章

  1. Python3基础(4)匿名函数、装饰器、生成器、迭代器、内置函数、json&pickle序列化、软件目录开发规范、不同目录间模块调用

    ---------------个人学习笔记--------------- ----------------本文作者吴疆-------------- ------点击此处链接至博客园原文------ 1 ...

  2. 小白的Python之路 day4 不同目录间进行模块调用(绝对路径和相对路径)

    一.常用模块调用函数功能解释 1.__file__ 功能:返回自身文件的相对路径 你从pycharm的执行结果可以看出,在pycharm执行atm.py文件时,是从绝对路径下去执行的,而你从cmd下去 ...

  3. python3 不同目录间模块调用

    #Author by Andy #_*_ coding:utf-8 _*_ #__file__获取当前程序的相对路径 import os,sys #print(__file__) # os.path. ...

  4. Python不同目录间模块调用

    #!/usr/bin/python # -*- coding: utf-8 -*- # 导入其它目录下的文件, 需要去帮获取当前程序的绝对路径并加入到环境变量的相对路径中 import os impo ...

  5. 函数和常用模块【day05】:不同目录间进行模块调用(八)

    本节内容 1.背景 2.函数功能解释 3.绝对路径和相对路径 4.不同目录间进行模块调用 一.背景 之前写了软件开发目录规范这篇博客,相信很多人都已经知道,我们在写程序时需要遵循一定的规范,不然,就算 ...

  6. python 在不同层级目录import 模块的方法

    有一个文件夹/home/a,  里面有个模块叫b.py,  我怎么把他import到程序里? 1). import sys; sys.path.append("/home/a/") ...

  7. python导入不同目录下模块的方法

    下面将具体介绍几种常用情况:(1)主程序与模块程序在同一目录下:如下面程序结构:`-- src    |-- mod1.py    `-- test1.py    若在程序test1.py中导入模块m ...

  8. python开发调用基础:模块的调用&制作包&软件开发规范

    一,包的调用 #!/usr/bin/env python #_*_coding:utf-8_*_ #调用 glance[1..4]\api\policy.py 路径 # policy.py 内容 # ...

  9. MSP430WARE++的使用3:modbus模块的调用方法

    MSP430WARE++的使用3:modbus模块的调用方法     MSP430WARE是一套基于C++语言的开源的MSP430层次化软件架构,支持多种外设. 本文将介绍modbus模块驱动程序的调 ...

随机推荐

  1. JavaScript数据类型转换汇总

    ECMAScirpt中的数据类型:undefined.Null.Boolean.Number.String.Object 对一个值使用typeof操作符可能返回下列某个字符串: number(数字). ...

  2. Django的模型层(2) - 多表操作(下)

    一.多表查询 1.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接 ...

  3. JIRA 模块 bug管理工具

    from jira import JIRA #导入jira jira=JIRA(server='http://127.0.0.1:8080', basic_auth=('name', 'passwor ...

  4. Nodejs关闭windows服务进程

    1.根据端口号,查询进程信息命令: netstat -aon | findstr "端口号" 2.根据pid杀死进程命令: taskkill /F /pid 进程号 完整代码: c ...

  5. 经典排序算法的总结及其Python实现

    经典排序算法总结: 结论: 排序算法无绝对优劣之分. 不稳定的排序算法有:选择排序.希尔排序.快速排序.堆排序(口诀:“快速.选择.希尔.堆”).其他排序算法均为稳定的排序算法. 第一趟排序后就能确定 ...

  6. url监控

    #!/usr/bin/env python #coding:utf-8 import MySQLdb,requests import time from datetime import datetim ...

  7. ptyhon从入门到放弃之操作系统基础

    *2.操作系统操作系统基础1.什么是操作系统操作系统就是一个协调.管理和控制计算机硬件和软件的控制程序.2.为何要有操作系统现代的计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器, ...

  8. Delphi 正则表达式语法(8): 引用子表达式 - 也叫反向引用

    Delphi 正则表达式语法(8): 引用子表达式 - 也叫反向引用 //准备: 我们先写一个搜索所有英文单词的表达式 var   reg: TPerlRegEx; begin   reg := TP ...

  9. ibatis $与#的区别

    在sql配置中比如in(#rewr#) 与in ($rewr$) 在Ibatis中我们使用SqlMap进行Sql查询时需要引用参数,在参数引用中遇到的符号#和$之间的区分为,#可以进行与编译,进行类型 ...

  10. PAT 天梯赛 L1-041. 寻找250 【水】

    题目链接 https://www.patest.cn/contests/gplt/L1-041 AC代码 #include <iostream> #include <cstdio&g ...