栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python中的包和模块

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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的对象

#下面是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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/886868.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号