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.返回
>>>:

posted @ 2017-07-30 23:36  Mr.hu  阅读(103)  评论(0编辑  收藏  举报