python import 自己写的包、模块相关问题

问题来源:

一般情况下,用import调用别人写的库,是没什么问题的。但是随着自己写的代码量增多,需要对相关文件进行组织管理,那就需要import自己写的东西了。就容易出现些问题。这篇文章主要就是介绍import自己写的模块、包等相关注意事项。

这里基本上只讲“怎么做”,不会讲“为什么”。

几个概念:

  1. 脚本:有“ if __name__ == "__main__" ” 这一句话的.py文件,也就是要运行的文件。
  2. 模块:.py文件,定义函数、类、变量。
  3. 包:有__init__.py文件的文件夹,用来存放模块。

几个规范:

  1. 使用import时,只导入包和模块,不单独导入函数、类、变量。Python语言规范 — Google 开源项目风格指南 (zh-google-styleguide.readthedocs.io)
  2. 使用每个模块的完整路径名来导入模块。
  3. 脚本不能使用相对导入。
  4. 如果导入的是一个包,则默认不会导入任何模块,除非在包的__init__.py文件里导入了相关的模块。

举例说明:

包内IMPORT

文件结构:

m1. py

def in_m1():
    print("this is m1.py!")

if __name__ == "__main__":
    in_m1()

m2.py

import m1


def in_m2():
    m1.in_m1()


if __name__ == "__main__":
    in_m2()

目前,直接运行m1.py 和 m2.py 是可以的,因为他们都是脚本。

但是如果从run.py调用m2,则会出现如下错误:

run.py

import common.m2

def in_run():
    m2.in_m2()

if __name__ == "__main__":
    in_run():

问题出现在import m1里面,需要使用相对导入。把m2.py 改成

from . import m1


def in_m2():
    m1.in_m1()


if __name__ == "__main__":
    in_m2()

这样就可以正常运行run.py了。同时,因为用了相对导入,那么m2.py就不是脚本,所以就不能直接运行。运行会报错:

相对导入方法看这个

【一分钟解决】Python报错ImportError: attempted relative import with no known parent package_jaredyam的博客-CSDN博客

导入包的问题

在run.py中,我们用的是import common.m2,导入的是模块。如果我们想导入这个包,也就是import common。那么在默认情况下是不会导入任何模块的,也就会报错:

run.py

import common

def in_run():
    m2.in_m2()

if __name__ == "__main__":
    in_run():

这就告诉我们,一般不要导入包。非要导入包,也得在common的__init__.py里面,导入相关模块。

看了相关资料,说的是在__init__.py写  from common.m2 import in_m2,不过试了下,编译器就报错了。还是用 from . import m2 才正确的。

导入模块函数

有时候,我们需要在模块间相互调用函数,只想导入某一个函数,而不想导入整个模块。这个时候,就可以用

from .xxx import func1 as fun

如果是同级,一定要加. 这样才是相对导入。

切记,模块只能用相对导入,否则脚本调用模块的时候,会报错。

总结

主要把python语言的文件夹组织和import规范了解了下。以免之后走弯路。主要就是前面的几个概念和规范了解了,那么对于利用python写一些比较大的项目,里面的import问题,能够有一个比较清晰的解决思路。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值