.py结尾的文件就是module,目录就是package
importimport 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 是啥。
- 是不是package.init.py 文件内变量
- 是不是packages内的subpackage
- 是不是package内的文件
- 不是抛出ImportError
相对和绝对路径其实不用太多介绍就好我们在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



