导入模块路径问题

我们在写实际项目时,同时是使用bin.py文件作为程序的入口,而经常把bin.py放入一个独立的bin包中,其他所有的功能函数均放在不同的独立的包中,此时要进行文件导入时,就要注意导入文件的路径了。
导入模块路径问题
那么此时,要在bin.py中导入test_login模块该如何导入呢?
1.首先,我们应该知道,在运行bin.py文件时,程序会将bin.py所在的上级文件夹路径临时加入到系统变量sys.path的列表中,如下图所示:
导入模块路径问题
2.此时如果要使用login下的test_login模块,我们只需要将文件WebDriver的文件夹导入到临时系统变量即可,如下图所示:
导入模块路径问题
之后便可调用test_login模块下的login函数了,如下图所示:
导入模块路径问题
如果不导入WebDriver的路径,直接调用test_login模块,系统将会报错,如下图所示:
导入模块路径问题
3.但是此时我们可以看到,我们导入的是绝对路径,如果你要把该程序的代码拷贝到其他人的电脑下运行,我们不能保证每个人的电脑文件夹树和自己的文件相同,此时就需要用到相对路径了。步骤如下:
3.1首先找到bin.py所在的绝对路径,使用file内置变量,如下图所示:
导入模块路径问题
3.2再找到bin.py所属文件夹的路径,如下图所示:
导入模块路径问题
3.3在使用相同的方法找到binw文件夹的上级文件夹WebDriver的路径,如下图所示:
导入模块路径问题
3.4此时再将Base_dir变量值导入到sys.path导入到临时系统变量中,即可调入test_login包下的其他模块了,其他包下的模块也可正常导入,如registerworkstate包下的patientlist模块,如下图所示:
导入模块路径问题

二、动态模块的导入问题
如下图,我们在模块动态导入方式模块中需要导入test目录下的School_test模块,如何操作呢?
导入模块路径问题
方式一:使用import函数,如下图:
导入模块路径问题
从上我们知道,使用import得到的是est.School_test(顶级级目录,也就是test路径,也可以看成是面向对象下的二级目录test路径)的路径,而不是test.School_test路径。也可使用该方法进行多级目录的操作(但得到的始终是二级目录的路径),如下图:
导入模块路径问题
该部分代码块如下:

#需求一:需要导入test目录下的School_test模块
r = __import__('test.School_test')
#打印目录
print(r.School_test)
#调用test目录下的School_test模块中School类下的price属性
print(r.School_test.School.price)
#调用test目录下的School_test模块中School类下的showinfo方法
print(r.School_test.School.showinfo)
#调用test目录下的School_test模块中School类下的__activy方法(私有方法)
print(r.School_test.School.__activy)        #报错

School_test类的代码如下:

class School():
    price = 12000
    __leadteacher = "刘昌明"   #双下划线开头的数据属性
    def __init__(self,name,addr,type):
        self.name = name
        self.addr = addr
        self.type = type

    def showinfo(self):
        print("%s位于%s,是一所%大学,学费是%s"%(self.name,self.addr,self.type,self.price))

    def __activy(self):
        print("学校正在举办书法比赛")

    def returninfo(self):           #通过类中的函数来访问隐藏的属性,以供外部调用,这才是真正意义上的封装
        print("这个学校的现在是%s"%self.__leadteacher)
        self.__activy()

方式二:使用importlib模块导入
如下图所示:
导入模块路径问题
从上图可知,使用importlib模块下的import_module()函数,直接是一步到位,得到的是最终要查找的py文件。
导入模块路径问题
该部分代码块如下:

import  importlib
module1 = importlib.import_module('test.School_test')
module2 = importlib.import_module('test.test1.School_test123')
#打印目录
print(module1)
print(module2)
#调用test目录下的School_test模块中School类下的price属性
print(module1.School.price)
#调用test/test1目录下的School_test123模块中School类下的price属性
print(module2.School.price1)
#调用test目录下的School_test模块中School类下的showinfo方法
print(module1.School.showinfo)
print(module2.School.showinfo)
#调用test目录下的School_test模块中School类下的__activy方法(私有方法)
print(module1.School.__activy)        #报错
print(module2.School.__activy)        #报错

总结:1.使用import方法进行导入,得到的是所查找字符串的顶级目录,格式如下import('a.c.v'),得到的始终是a的路径,要想使用c下的py文件或者v.py,则需要依次向下查找;2.使用importlib模块进行导入,得到的是最终需要查找的文件路径,格式如下:importlib.import_module(('a.c.v'),直接得到的就是v的路径。
使用这两两种方法进行文件导入,就可以避免使用绝对路径而导致因文件夹布局不同而产生的问题了。

转载于:https://blog.51cto.com/10836356/2103521

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值