前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python 模块导入问题

python 模块导入问题

作者头像
叶子陪你玩
发布2022-05-22 14:57:19
1.6K0
发布2022-05-22 14:57:19
举报

在python中,模块导入和编码都是比较重要的,这两种东西一定要花时间弄清楚,如果摸棱两可,每次出问题都靠猜,那是非常痛苦的。

今天主要讲讲多层目录之前相互导入的一些问题。

通常,相同层级目录模块导入非常好理解且也不容易出错。

代码语言:javascript
复制
├─module_a
│      a1.py
│      a2.py
│      __init__.py
代码语言:javascript
复制
# a1.py
print('a1')

导入a1模块,直接import a1导入即可。

代码语言:javascript
复制
# a2.py
import a1
print('a2')

运行结果:

代码语言:javascript
复制
a1
a2

下面看看多层目录。

代码语言:javascript
复制
│  main.py
│
├─module_a
│      a1.py
│      a2.py
│      __init__.py
代码语言:javascript
复制
# a1.py
print('a1')
代码语言:javascript
复制
# a2.py
import a1
print('a2')
代码语言:javascript
复制
# main.py
from module_a import a2
print('main')

猜猜运行main.py运行结果是什么?

正常我们会觉得是:

代码语言:javascript
复制
a1
a2
main

实际结果报错,说在a2.py中导入a1时,找不到 a1模块。

代码语言:javascript
复制
Traceback (most recent call last):
  File "E:\QQ坚果云\模块导入\main.py", line 1, in <module>
    from module_a import a2
  File "E:\QQ坚果云\模块导入\module_a\a2.py", line 1, in <module>
    import a1
ModuleNotFoundError: No module named 'a1'

这是怎么回事,前面同层运行都行,这里怎么就不行了呢?


下面我们改改a2中的导入:

修改前:

代码语言:javascript
复制
# a2.py
import a1
print('a2')

修改后:

代码语言:javascript
复制
# a2.py
from module_a import a1
print('a2')

此时如果运行 a2.py,会出现下面报错:

代码语言:javascript
复制
Traceback (most recent call last):
  File "E:\QQ坚果云\模块导入\module_a\a2.py", line 1, in <module>
    from module_a import a1
ModuleNotFoundError: No module named 'module_a'

这个很好理解,a1和a2本来就在一个目录下,直接从外层往里读,是无法读到的。

虽然运行a2.py报错,但是直接运行main.py ,发现居然可以了。

代码语言:javascript
复制
# main.py
from module_a import a2
print('main')

运行结果:

代码语言:javascript
复制
a1
a2
main

结论:

要理解上面的问题,核心就是要弄清楚项目的运行起点,运行那个程序,就以那个程序为运行起点。

如果需要跨包运行呢,既要main.py可以运行,又要a2.py可以运行呢?

只需要运行前添加路径即可。

代码语言:javascript
复制
# a2.py
import sys
sys.path.append('./module_a')
import a1
print('a2')

上面的测试,可能在有些编辑器会不一样,原因可能是你的编辑器会自动给你添加路径,建议直接shell中测试运行。

更多层级的包模块原理一样,具体实际做项目碰到库导入问题,大概率就是上面的问题没弄清楚。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 叶子陪你玩编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档