背景:
即使是写一个比较小的程序,也肯定会有人建议你将程序模块化。程序模块化必然涉及跨文件调用和跨目录调用,即Python中最常见的import module
和from module import xxx
。类似C中的#include
。
如果你足够幸运,肯定会遇见那个她:
ModuleNotFoundError: No module named 'c'
或者这个她:
ImportError: cannot import name 'ccc' from 'lib' (unknown location)
一定是缘分吧,这意味着你需要花一定的时间进行专题训练了!GO
训练场
- 同级目录跨文件调用
if name == 'main’标记该模块为执行程序 - 调用当前目录的子目录中的模块,即调用当前目录中包的模块
每一个包都需要创建一个__init__.py,该文件允许为空
某书籍有说这里需要将packet_A的路径加入sys.path。比如sys.path.append('/packet_A')
在下验证中发现并不需要。原因大概是packet_A这个包的路径已经在__file__(执行程序的绝对路径,不包含文件名),而__file__已经在sys.path中。 - 调用父目录中的模块
4.调用父目录中子目录中的模块,即调用父目录中包的模块
4.1 将module_C.py这个模块的路径加入sys.path
4.2 将packet_B这个包的路径加入sys.path,然后调用这个包中模块module_C.py
5.第5种情况,调用包中嵌套的包中的模块。
总结
以上5种示例,其实都源于一个逻辑:
只要我们确定待导入模块或待导入包所在的路径,并把这个路径告诉Python,Python就可以找到这个模块了
Tips
sys.append()加入的是包所在的路径,那么导入该包中的模块
需要用 from 包 import 模块
sys.append()加入的是模块所在的路径,那么导入该包中的模块
可以直接 import 模块
还可以 from 模块 import 方法