目录结构
一、首先我们设置好工作路径
把relative设为resource root,并且为每个py文件设置好工作路径
二、测试代码
# moduley.py
from .modulex import add
from .. import modulea
def new():
modulea.abc()
add()
# modulex.py
def add():
print("成功调用add")
# modulea.py
def abc():
print("成功调用abc")
# temp.py
from subpacket1 import moduley
moduley.new()
直接运行moduley.py,报错如下
这里
f
r
o
m
.
.
from ..
from.. 也会报错,只是因为
f
r
o
m
.
m
o
d
u
l
e
x
from .modulex
from.modulex先执行
报错原因是因为,在使用相对路径时,其父模块需要被加载,某一py文件被执行时,其所在的目录级下文件是加载到系统中的,这时可以使用绝对路径,例如
# moduley.py
from modulex import add
这样是不会报错的(虽然在pycharm中会标红),但是如果想引入mudulea.py中的函数,则需使用从根目录开始的绝对路径,因为modulea.py是直接在根目录下的,只需直接import就好,这时文章开头的resource root的设置就很重要。
import modulea
这样,直接运行moduley.py就不会报错了
三、相对路径的使用
虽然更改一下就不会报错,但是我们还是希望使用相对路径,实际上,在当前执行py文件父模块被加载后,执行该文件是不会报错的,说明如下:
将文件目录更改如下
运行temp.py时,同级文件和文件目录已经被加载,也就是subpacket1已经被加载,也就是moduley,py中
f
r
o
m
.
.
from ..
from..中
.
.
..
..被加载,这时就可以使用相对路径。而temp.py
还是不能使用相对路径,因为执行temp.py时,其同级文件被加载,但是其父模块没有被加载,所以不能使用相对路径,只能使用绝对路径,使用绝对路径时,temp.py同级目录被加载,绝对路径也就是从这一级开始。
总结
py文件执行时,会把同级文件和文件目录加载,如果某py文件在执行时想使用相对路径,需要该文件父模块被加载,否则只能使用绝对路径,绝对路径的使用仍然是看文件或者文件目录加载情况