python中相对导入的问题

本文针对Python中遇到的两个常见导入问题进行了深入剖析:一是使用相对导入导致的错误;二是模块重复导入导致的问题,并给出了相应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题一:使用了相对导入,但是执行时报 “ValueError: Attempted relative import in non-package”

查文档,原因是当前执行的模块不能含有相对导入。所以你需要有一个启动模块,将其导入后再执行

问题二:模块重复导入

python通过sys.modules来保存导入过的模块,但是如果在一个模块内部来运行时,有可能存在双重导入的问题。比如以下目录结构:

testdir/
    c/
        __init__.py
        b.py

__init__.py 的内容是:

x = []

如果在C目录下运行b.py,那么如果它要使用 __init__.py 中的变量(函数重复导入也无所谓),会有两种写法:

import sys
sys.path.insert(0, '..')
from c import x
print id(x)

from __init__ import x
print id(x)
  • 第一种是向sys.path插入父目录,然后通过导入模块来得到 x 变量。
  • 第二种是通过导入 init 来得到 x 变量

执行以上的代码,你会发现两个输出的id值是不同的,即 __init__.py 被重复导入了。

在网上搜到一篇文章讲了python的一些陷阱可以参考一下。

因此对于这种情况,首先采用一致的导入方式,另外执行代码最好是在包的外面。

转载于:https://my.oschina.net/limodou/blog/170391

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值