包是一群模块文件+__init__文件的文件夹。python3中没有__init__文件也叫作包,python2中包必须有__init__文件否则会报错
导入包的本质就是就是执行该包下的init文件。
导入:
1.用绝对路径导入:以项目文件为基准
题目要求:在cmd中的day2中导入api中day1中的d1函数。
你可能会这样写
from package.api.day1 import d1 def d2(): print('这是day2')
首先这样写在pycharm中运行没问题,因为pycharm把项目pake的绝对路径自动添加到sys.path中,但是你要知道,等你在linux系统中运行的时候是没有pycharm的,没有帮你把路径添加到sys.path中。
所以我们要自己添加
import os,sys p_path=os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) #__file__在pycharm中会打印出绝对路径,在linux是相对路径,所以这里要用abspath转换一下 sys.path.append(p_path) from package.api.day1 import d1 def d2(): print('这是day2')
我们自己拼接的这个路径是动态的路径,跟着文件夹会变动,而pycharm提供的,是个死的不会变动。
我们再看一个例子
题目要求:从day2中导入day31已知day1文件中import day3,我们执行day2你会发现报错
ModuleNotFoundError: No module named 'day3'
这是因为什么呢,这是因为导入路径出现了错误,因为我们把pake文件夹的路径放到了sys。path中所以所有的导入要用package的路径开始,应该在day1中这样写
from package.api import day3
__init__.py: 导入包实质上是导入包下面的init文件
题目要求,在p_test文件中导入day5文件下的任意模块
首先在package的包中的init文件中写入
from package import day5
from package import day6
然后再day5包中的init 文件中写入
from package. day5 import text1
from package. day5 import text3
然后再day6包中的init 文件中写入
from package. day6 import text2
from package. day6 import text4
这样在p_test文件中这样写:
import package package.day5.text1.test1()
结果:
in the test1
如果你不用上面的init方法你可以这样写:
import package.day5.text1 package.day5.text1.test1()
结果:
in the test1
绝对路径的局限性:如果你把你写的包放到另一个文件中,里面的程序会发生错误。在pycharm中不会发生错误,因为,它替你把目录自动更新了,但是在lniux系统中会发生错误。
2.用相对路径导入,只能在包外部使用,好处:不用关心包内代码的导入关系会发生错误(多用相对导入),
把上面的文件改为:
首先在package的包中的init文件中写入
from .import day5
from . import day6
然后再day5包中的init 文件中写入
from . import text1
from . import text3
然后再day6包中的init 文件中写入
from .import text2
from . import text4
这样在p_test文件中这样写:
import package
package.day5.text1.test1()
结果:
in the test1