python中的包和模块

.py结尾的文件就是module,目录就是package

import

import module
import package.module
from package import module
from . import module
from .package import module
from ..package import module

上面是几种导入示例,虽然写了package 和module 但是请记住 import 实际导入的是对象。module也是对象

#名如module的对象
<module 'package.b' from 'D:\\project\\xxxxx\\packages\\b.py'>
#下面是import分别导入的对象,直接导入py文件,导入包下的py文件,导入包下的包,导入包下包的__init__.py里面的整数变量
'__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a']
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'k']
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_count', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']

所以from package import something会按照下面的搜索someting 是啥。

  1. 是不是package.init.py 文件内变量
  2. 是不是packages内的subpackage
  3. 是不是package内的文件
  4. 不是抛出ImportError

import 相对路径和绝对路径

相对和绝对路径其实不用太多介绍就好我们在linux shell里面操作目录一样

#绝对导入,比如导入环境变量(sys.path)中的库
import os
#下面都是相对导入的例子
#当前目录
from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
#上一层目录
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo
#上上曾目录
from ...package import bar
from ...sys import path

其实讲到直接就差不多了。不过有一个很多人没注意的地方,包括我自己。就是我们写代码的时候用的__name____package__,他代表的是当前模块的名字。python 就是用它来确定相对路径的中那个点在哪的,请看下面的分p

__name____package__

当我们运行python xxxx或者python -m xxxx 。其实这个xxxx即可以是目录也可以是py文件。那么我们怎么规定函数入口在哪呢。module中__name__ = '__main__',标识程序的入口、__package__=xxxxx 表示 import中的点。

所以python xxxx 文件的和目录的时候 __name__ == '__main__ ,__package__=xxxxx

所以对于文件来说:
python xxxx, __name__ == ’__main__ ‘ ,__package__=None
python -m xxxx , __name__ =='‘__main__ ’ ,__package__=‘’

对于目录来说
python xxxx, __name__ == ’__main__ ‘ ,__package__=‘’
python -m xxxx , __name__ == ‘__main__ ’ ,__package__=‘xxxx’

上面 __package__= 空和none 的 情况下我们是没法使用 相对路径的。要想使用要么手动赋值,要么 python -m xxxx
所以下次在遇到 什么
ImportError: attempted relative import with no known parent xxxxx或者No module named xxx 各位可以试试还是很好用的

[参考]
执行代码出现ImportError:attempted relative import with no known parent package,
https://www.cnblogs.com/scarecrow-blog/p/10419330.html
PEP 328 – Imports: Multi-Line and Absolute/Relative,
https://peps.python.org/pep-0328/#rationale-for-absolute-imports

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值