zoukankan      html  css  js  c++  java
  • 函数和常用模块【day05】:不同目录间进行模块调用(八)

    本节内容

    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:PycharmProjects51homework>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:PycharmProjects51homework>python Atm/bin/atm.py
    D:PycharmProjects51homeworkAtmbinatm.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:PycharmProjects51homework>python Atm/bin/atm.py
    D:PycharmProjects51homeworkAtmbin  #只返回目录名,不需要文件名

    4、sys.path

    功能:python环境的执行的环境变量

    1
    2
    3
    4
    5
    6
    7
    8
    #atm.py中的代码
    import sys
    print(sys.path)
    #cmd执行的结果
    D:PycharmProjects51homework>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:PycharmProjects51homework>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'这一层,其他的层级无法调用。那怎么办呐?

    步骤如下:

    1. 获取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__) ) ) #Atm的绝对路径
    print(BASE_DIR)
    sys.path.append(BASE_DIR)  #添加到环境变量中
    print(sys.path)
     
    #cmd执行结果
    D:PycharmProjects51homework>python Atm/bin/atm.py   #执行atm.py文件
    D:PycharmProjects51homeworkAtm   #打印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:PycharmProjects51homework>python Atm/bin/atm.py
    hello word
  • 相关阅读:
    让WPF和SL控件同时支持绑定和赋值
    VS2010下如何调试Framework源代码(即FCL)
    使用Entity Framework和WCF Ria Services开发SilverLight之2:POCO
    WPF快速指导15:动画
    改善C#程序的建议5:引用类型赋值为null与加速垃圾回收
    使用Entity Framework和WCF Ria Services开发SilverLight之1:简单模型
    MVVM中的命令绑定及命令参数
    改善C#程序的建议7:正确停止线程
    Prism安装、MVVM基础概念及一个简单的样例
    改善C#程序的建议8:避免锁定不恰当的同步对象
  • 原文地址:https://www.cnblogs.com/luoahong/p/9890020.html
Copyright © 2011-2022 走看看