在python中,我们会遇到
__file__
__main__
__all__
__name__
那么,他们都是什么意思呢。
首先说一下__name__
和 __main__
参考资料:name and main
__name__
是内置变量,用于表示当前模块的名字,同时还能反映一个包的结构。来举个例子,假设有如下一个包:
if __name__ == '__main__'
我们简单的理解就是: 如果模块是被直接运行的,则代码块被运行,如果模块是被导入的,则代码块不被运行。
看一个目录结构:
test_1 code
import test_2
from demo import test_demo
print(__name__)
test_2 and test_demo code
print(__name__)
We run test_1 code
The results:
test_2
demo.test_demo
__main__
我们可以看到,__name__
的作用,就是告诉你执行代码的调用的包名。
如果 __name__
在当前脚本下面执行,那么print(__name__)
就会打印__main__
__init__
和__all__
init其实是初始化时会用到的一个,每个包下面都会有一个init,我们导入这个包的时候,会自动的执行init里面的代码。
__all__
的作用就是,在这个带有init的文件夹下,我们可以有选择的,导入文件。没有放在__all__
中的,不会被导入,参考资料
最后在说一下__file__
的用法
先说用法:保持当前文件夹不变
os.path.abspath(__file__)
搭配:
os.path.dirname(os.path.abspath(__file__))
小例子:
区分下面两个代码的不同:
print(os.path.abspath("."))
print(os.path.dirname(os.path.abspath(__file__)))
我们的结构如下:
test_demo 的代码:
import os
print(os.path.abspath("."))
print(os.path.dirname(os.path.abspath(__file__)))
我们直接执行,结果如下:
/Users/bytedance/PycharmProjects/test/demo
/Users/bytedance/PycharmProjects/test/demo
test_2 代码如下:
from demo import test_demo
我们直接执行,代码如下:
/Users/bytedance/PycharmProjects/test
/Users/bytedance/PycharmProjects/test/demo
可以看到什么,如果我们在test_2 文件夹下面执行,那么print(os.path.abspath("."))
这段代码就相当于在test_2下面执行。