.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 是啥。
- 是不是package.init.py 文件内变量
- 是不是packages内的subpackage
- 是不是package内的文件
- 不是抛出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