day4-不同目录间进行模块调用
背景
前面我们说了软件目录的开发规范,那么不同目录间的模块如何相互导入呢,首先我们需要了解下两个概念:绝对路径和相对路径
绝对路径:文件在硬盘上真正存在的路径("/")
相对路径:所谓相对路径,就是相对于自己目标文件的位置("空")
函数功能解释
1.__file__
用法:返回自身文件的相对路径
#在Pycharm软件上执行core.py print(__file__) #输出
#在Mac或Linux系统上执行core.py bogon:ATM huwei$ python3 core.py core.py #1:在当前core.py目录下执行程序 bogon:ATM huwei$ cd .. bogon:module_2 huwei$ pwd /Users/huwei/PycharmProjects/s14/module_2 bogon:module_2 huwei$ cd .. bogon:s14 huwei$ pwd /Users/huwei/PycharmProjects/s14 bogon:s14 huwei$ python3 module_2/ATM/core.py module_2/ATM/core.py #2:在s14目录下执行相对路径module_2/ATM/core.py程序 bogon:s14 huwei$ cd .. bogon:PycharmProjects huwei$ pwd /Users/huwei/PycharmProjects bogon:PycharmProjects huwei$ python3 s14/module_2/ATM/core.py s14/module_2/ATM/core.py #3:在PycharmProject目录下执行相对路径s14/module_2/ATM/core.py程序
解析:从上面的结果来看,在Pycharm下core.py绝对路径下执行core.py输出的是绝对路径,而在Linux系统中不同目录下相对路径执行命令输出是相对路径,其实__file__表示的是相对路径,在哪个路径下执行命令,就打印出哪个路径。
2.os.path.abs()
用法:返回自身文件的绝对路径
#在Pycharm上执行 import os,sys print(os.path.abspath(__file__)) #输出
#在Linux系统的相对路径执行core.py bogon:PycharmProjects huwei$ python3 s14/module_2/ATM/core.py /Users/huwei/PycharmProjects/s14/module_2/ATM/core.py #输出的是绝对路径 bogon:PycharmProjects huwei$ pwd /Users/huwei/PycharmProjects
3.os.path.dirname()
用法:返回当前文件所在的目录名
import os,sys print(os.path.dirname(__file__)) #输出 /Users/huwei/PycharmProjects/s14/module_2/ATM #返回目录名
4.sys.path
用法:返回python程序的环境变量
import os,sys print(sys.path) #输出 环境变量 ['/Users/huwei/PycharmProjects/s14/module_2/ATM', '/Users/huwei/PycharmProjects/s14', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python35.zip', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages'] #列表的形式
不同目录间进行模块调用
在不同目录间进行模块的调用,我们需要添加环境变量,下面以ATM+购物商城程序来举例
如果我们需要主程序入口main.py中调用bin目录中atm_start主程序运行的代码,而atm_start主程序又要调用modules中的admin_center和authenticate模块,他们不同目录之间怎么进行相互调用呢?因为main.py所在目录和admin_center.py及atm_start属于不同的目录,通过观察可以发现他们父级的父级是共同的目录,就是ATM+购物商城文件夹,在ATM+购物商城文件夹下存在他们各自的父级目录。
1.首先我们要获取ATM+购物商城的绝对路径
2.将此包含两个文件的父级的共同的文件夹ATM+购物商城的路径添加到环境变量中
import os,sys BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) print(BASE_DIR) sys.path.append(BASE_DIR) #将此文件绝对路径加入到当前Python程序的环境变量中 #输出
在导入相应的目录下的模块后,就可以相互进行调用了:
bin文件夹下atm_start.py代码:
import os,sys #导入模块 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #获取ATM+购物商城的文件夹绝对路径 sys.path.append(BASE_DIR) #将此绝对路径导入到环境变量中 db_user = BASE_DIR + r"/database/user" #通过导入的环境变量连接相应的数据库文件 #在ATM+购物商城的文件夹下导入相应模块 from modules import admin_center,authenticate def option_personal(login_user): while True: option_list = ["修改登陆密码","返回"] count = 0 for option in option_list: count += 1 print(str(count) + '.' + option) user_choice = input(">>>:") if user_choice.isdecimal(): if int(user_choice) == 1: print("\33[35;1m修改登陆密码\033[0m".center(40, "#")) admin_center.update_password(login_user) elif int(user_choice) == 2: print("\33[35;1m返回\033[0m".center(40, "#")) break else: print("无效的字符") def option_shopping(login_user): while True: print("\33[35;1m购物中心\033[0m".center(40, "-")) option_list = ["个人中心","返回"] count = 0 for option in option_list: count += 1 print(str(count) + '.' + option) user_choice = input(">>>:") if user_choice.isdecimal(): if int(user_choice) == 1: print("\33[35;1m个人中心\033[0m".center(40, "#")) option_personal(login_user) elif int(user_choice) == 2: print("\33[35;1m返回\033[0m".center(40, "#")) break else: print("无效的字符") while True: print("\33[35;1m欢迎进入信用卡网购程序\033[0m".center(40, "=")) option_list = ["购物中心","退出"] count = 0 for option in option_list: count += 1 print(str(count) + '.' + option) user_choice = input(">>>:") if user_choice.isdecimal(): if int(user_choice) == 1: option_shopping(authenticate.user_auth()) elif int(user_choice) == 2: print("再见!") break else: print("无效的字符")
core文件夹下main.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) #将此绝对路径导入到环境变量中 from bin import atm_start atm_start.login() #程序的主入口
modules文件夹下admin_center.py代码:
import os,sys,json,logging BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR) db_user = BASE_DIR + r"/database/user" db_credit_info = BASE_DIR + r"/database/creditcard_info" user_log = BASE_DIR + r"/log/user_flowlog" def update_password(login_user): while True: with open(db_user, "r+", encoding="utf-8") as f: user_dic = json.loads(f.read()) print("当前用户账号:% s\n当前用户密码:%s" % (login_user, user_dic[login_user]["password"])) choice = input("是否修改当前密码,是'y',返回按'b':") if choice == 'y': old_pwd = input("请输入%s的原密码:" % login_user) if old_pwd == user_dic[login_user]["password"]: new_pwd = input("请输入%s的新密码:" % login_user) user_dic[login_user]["password"] = new_pwd user = json.dumps(user_dic) f.seek(0) f.write(user) print("%s 密码修改成功!" % login_user) break else: print("%s 原密码不正确,请重新输入!" % login_user) elif choice == 'b': break
在database文件夹下的user文件:
{"huwei": {"locked": "false", "password": "15995721569", "creditcard": "111111", "username": "huwei"}}"}}
程序执行结果:
=========欢迎进入信用卡网购程序=========
1.购物中心
2.退出
>>>:1
#################用户登陆认证#################
请输入用户名:huwei
请输入密码:15995721569
用户huwei认证成功
------------购物中心-------------
1.个人中心
2.返回
>>>:1
############个人中心#############
1.修改登陆密码
2.返回
>>>:1
###########修改登陆密码############
当前用户账号:huwei
当前用户密码:15995721569
是否修改当前密码,是'y',返回按'b':y
请输入huwei的原密码:15995721569
请输入huwei的新密码:huwei123
huwei 密码修改成功!
1.修改登陆密码
2.返回
>>>: