python导入模块路径问题_导入模块路径问题

我们在写实际项目时,同时是使用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的路径。

使用这两两种方法进行文件导入,就可以避免使用绝对路径而导致因文件夹布局不同而产生的问题了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值