鱼C论坛

 找回密码
 立即注册
查看: 1440|回复: 11

[已解决]Python3 包的import,报错

[复制链接]
发表于 2022-2-14 16:50:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Python3 包的import,报错 ImportError: attempted relative import with no known parent package
文件结构:
test_case一级目录
        common.py
        test.py
        case二级目录
             test1.py

test1.py 需要使用到common.py里面的方法,from .. import common

main 函数在 test.py中,test.py是程序的入口,会去执行test1.py里面的内容
最佳答案
2022-2-14 18:05:10
本帖最后由 isdkz 于 2022-2-14 18:06 编辑
wxfcc 发表于 2022-2-14 17:54
所以test1.py里面的import应该怎么写呢?


如果test.py就是主程序文件的话,你test1.py导入common.py直接使用 import common(之所以可以这么使用是因为绝对导入是根据主程序文件导入的,因为common.py跟主程序文件同级,所以可以直接import),

关于相对导入的内容你可以看一下我上面说的,有什么不懂的再问我
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-14 17:41:13 | 显示全部楼层
本帖最后由 isdkz 于 2022-3-11 17:40 编辑

相对导入必须有一个父包且无法越过顶级包,那什么是父包呢,举个例子:

from a import b 或者 import a.b 这两种导入方式实际上都是导入了a.b,区别只是第一种方式把b纳入了当前命名空间,第二种方式是把a.b纳入了当前命名空间
你可以用下面的代码来验证这个说法,sys.modules可以看到导入的模块
import sys
print(sys.modules)

那既然这两种方式都是导入了a.b,所以不管这两种方式不管哪种方式导入,a就是b的父包

那父包有了,无法越过顶级包又是什么意思呢,顶级包是什么呢,比如你这个包藏的很深,import a.b.c.d,a就是它们的顶级包
就是相对导入(from . import c 当前目录、from .. import c 上一级目录,from ... import c 上上级目录)的方式不管怎么跳级都不能跳出顶级包,也就是不能跳到跟它的顶级包同级

就是假如a是b的顶级包的话,而c又跟a同级,你想通过相对导入的方式导入c就行不通了,得用绝对导入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-14 17:54:50 | 显示全部楼层
isdkz 发表于 2022-2-14 17:41
相对导入必须有一个父包且无法越过父包

所以test1.py里面的import应该怎么写呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-14 18:05:10 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2022-2-14 18:06 编辑
wxfcc 发表于 2022-2-14 17:54
所以test1.py里面的import应该怎么写呢?


如果test.py就是主程序文件的话,你test1.py导入common.py直接使用 import common(之所以可以这么使用是因为绝对导入是根据主程序文件导入的,因为common.py跟主程序文件同级,所以可以直接import),

关于相对导入的内容你可以看一下我上面说的,有什么不懂的再问我
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-14 18:21:51 | 显示全部楼层
isdkz 发表于 2022-2-14 17:41
相对导入必须有一个父包且无法越过父包,那什么是父包呢,举个例子:

from a import b 或者 import a.b  ...

这个程序如果用相对导入的方式话,应该怎么写呢?或者怎么调整目录结构呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-14 18:28:19 | 显示全部楼层
wxfcc 发表于 2022-2-14 18:21
这个程序如果用相对导入的方式话,应该怎么写呢?或者怎么调整目录结构呢?

test.py       这个使用import test_case一级目录.case二级目录.test1  或  from test_case一级目录.case二级目录 import test1
test_case一级目录
        common.py
        case二级目录
             test1.py       这个使用 from .. import common

这样,test1的上级目录没有越过他的顶级包(即test_case一级目录)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-14 18:30:05 | 显示全部楼层
wxfcc 发表于 2022-2-14 18:21
这个程序如果用相对导入的方式话,应该怎么写呢?或者怎么调整目录结构呢?

我改了一下我最前面说的,应该是无法越过顶级包
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-14 18:54:22 | 显示全部楼层
isdkz 发表于 2022-2-14 18:28
test.py       这个使用import test_case一级目录.case二级目录.test1  或  from test_case一级目录.case ...

按照你这种方式引入包的时候,报错了,提示:ModuleNotFoundError: No module named 'test_case一级目录'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-14 19:12:53 | 显示全部楼层
你确定你的test.py是跟一级目录同级了,且一级目录的名字对了,导入的时候你得根据你那里的名字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-14 19:46:22 | 显示全部楼层
首先,你得是个 "包",python里的包,是指 一个目录,且这个目录里有一个 __init__.py文件
所以,首先 请确定你的各个模块目录(文件夹)里是否有这么一个 __init__.py 文件。

然后,你才可以 写各种 import,无论是 from top.subpackage import xxx ,还是 import xx ,
只要你保证拼写正确,路径明确,这些通常只是写法上的差异,不行就换一个写法,
因为有些版本并不能很好地解析出正确的路径,所以 这一块若报错找不到,就换一种写法,试试。

跨文件夹的import,关键是第一步的 有没有__init__.py
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-14 19:56:34 | 显示全部楼层
本帖最后由 isdkz 于 2022-2-14 20:00 编辑
阿奇_o 发表于 2022-2-14 19:46
首先,你得是个 "包",python里的包,是指 一个目录,且这个目录里有一个 __init__.py文件
所以,首先 请 ...


包不一定需要有__init__.py,只不过有__init__.py的话,导入包的时候它会先执行__init__.py执行必要的初始化操作,没有__init__.py它就会成为一个命名空间包,你可以用
import sys
print(sys.modules)
来查看没有__init__.py的包跟普通包的区别

普通的包:
捕获1.PNG

命名空间包:
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-14 20:09:09 | 显示全部楼层
test1.py需要在test_cas外面用 你放里面有啥用  
比如你import numpy  你会去写一个代码丢到numpy  包的里面去用吗  包就是给包外面的代码用的 里面别指望能运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 07:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表