• day4-不同目录间模块的调用


    1.前言

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


    2.重要功能函数

    1. __file__
      功能:返回文件自身所在的路径。
      请注意我们我们一般通过print(__file__)来返回获得当前文件所在的路径,但是不能直接在命令行下以交互的方式来使用它,必须定义在一个保存好的py文件中后去执行它
      image
      命令行下直接使用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.1python.exe" D:/python/S13/Day5/test/bin/test.py
        7 D:/python/S13/Day5/test/bin/test.py
        8 
        9 # CMD执行结果
       10 D:pythonS13Day5	estin>python D:/python/S13/Day5/test/bin/test.py  #在文件所在路径下以绝对路径方式传入文件,返回的仍然是绝对路径
       11 D:/python/S13/Day5/test/bin/test.py
       12 D:pythonS13Day5	estin>cd ..
       13 D:pythonS13Day5	est>python D:/python/S13/Day5/test/bin/test.py
       14 D:/python/S13/Day5/test/bin/test.py
       15 D:pythonS13Day5	est>cd ..
       16 D:pythonS13Day5>python test/bin/test.py #只有以相对路径形式传入文件,才能返回相对路径
       17 test/bin/test.py
    2. os.path.dirname(file)
      功能:返回给定参数文件所在的目录(路径)。
      注意返回的路径是相对路径还是绝对路径取决于传递的参数形式,如果以绝对路径形式传入参数文件,则返回绝对路径,反之则返回相对路径
        1 >>> print(os.path.abspath('.'))
        2 D:pythonS13Day5
        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.1python.exe" D:/python/S13/Day5/test/bin/test.py
       15 D:pythonS13Day5	estin
       16 
    3. os.path.abspath(file)
      功能:返回文件对象的绝对路径(包含文件本身在内)

        1 #test.py代码
        2 import os
        3 print(os.path.abspath(__file__))
        4 
        5 #cmd下执行结果
        6 D:pythonS13>python day5/test/bin/test.py
        7 D:pythonS13day5	estin	est.py
    4. sys.path
      功能:返回python当前可执行的环境变量
        1 import sys
        2 print(sys.path)
        3 
        4 D:pythonS13>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:pythonS13>python D:pythonS13Day5	estin	est.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中,这样才能方便调用项目中任何目录下的模块。
    下面通过一个直观的栗子来实践一下。

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

    image
    项目的根目录是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.1python.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!

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

  • 相关阅读:
    C# List<T>用法(转)
    任务列表 (Visual Studio)
    TSQL行转列、列转行
    HRESULT:0x80070057 (E_INVALIDARG)的异常的解决方案(转)
    JS正则表达式详解(转)
    Windows远程登录命令
    JavaScript中的try...catch和异常处理(转)
    javascript如何触发button 的click事件
    在ASP.NET中利JavaScript实现控件的聚焦(转)
    输入一个字符串,将其逆序后输出。(使用C++,不建议用伪码)
  • 原文地址:https://www.cnblogs.com/linupython/p/7736816.html
Copyright © 2020-2023  润新知