pycharm中相对路径的问题,解惑attempted relative import with no known parent package以及超出了顶层package进行相对导入问题

目录结构

pycharm中相对路径的问题,解惑attempted relative import with no known parent package以及超出了顶层package进行相对导入问题_第1张图片

一、首先我们设置好工作路径

把relative设为resource root,并且为每个py文件设置好工作路径
pycharm中相对路径的问题,解惑attempted relative import with no known parent package以及超出了顶层package进行相对导入问题_第2张图片

二、测试代码

# 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,报错如下
pycharm中相对路径的问题,解惑attempted relative import with no known parent package以及超出了顶层package进行相对导入问题_第3张图片
这里 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文件父模块被加载后,执行该文件是不会报错的,说明如下:

将文件目录更改如下

pycharm中相对路径的问题,解惑attempted relative import with no known parent package以及超出了顶层package进行相对导入问题_第4张图片
运行temp.py时,同级文件和文件目录已经被加载,也就是subpacket1已经被加载,也就是moduley,py中 f r o m . . from .. from.. . . .. ..被加载,这时就可以使用相对路径。而temp.py
还是不能使用相对路径,因为执行temp.py时,其同级文件被加载,但是其父模块没有被加载,所以不能使用相对路径,只能使用绝对路径,使用绝对路径时,temp.py同级目录被加载,绝对路径也就是从这一级开始。

总结

py文件执行时,会把同级文件和文件目录加载,如果某py文件在执行时想使用相对路径,需要该文件父模块被加载,否则只能使用绝对路径,绝对路径的使用仍然是看文件或者文件目录加载情况

你可能感兴趣的:(pycharm,python,ide)