Python 创建模块笔记

                     

贡献者: addis

  • 本文处于草稿阶段。

1. 区分脚本和模块

   有时候我们希望同一个 .py 文件既可以作为脚本直接执行也可以作为模块被导入,并且希望该文件可以根据这两种方式自动选择执行什么。这时可以用 __name__ 来判断:

代码 1:my_module.py
#!/usr/bin/python3
# 执行一些命令(无论作为脚本还是模块都会被运行)
# 被赋值的变量会作为模块的全局变量, 定义的函数会作为模板中的函数

print('欢迎使用 my_module.py')

def plus1(num):
    return num + 1

num = 3.5
num2 = plus1(num)

if __name__ == '__main__':
    # 脚本模式下运行的命令
    print('正在被作为脚本执行,  __name__ 的值为 __main__')
else:
    # 作为模块导入时运行的命令
    print('正在被作为模块导入, __name__ 的值为', __name__)
若运行 ./my_module.py 或者 python3 my_module.py 或者 python3 -m my_module,就会得到(-m 选项把模块作为脚本运行)
欢迎使用 my_module.py
正在被作为脚本执行,  __name__ 的值为 __main__
若在同目录下进入 python3 运行 import my_module(或者 import my_module as 其他名字),就会得到
欢迎使用 my_module.py
正在被作为模块导入, __name__ 的值为 my_module

   再来写另一个模块调用上面的模块

代码 2:my_module2.py
#!/usr/bin/python3

print('欢迎使用 my_module2.py')

def plus2(num):
    return num + 2

if __name__ == '__main__':
    # 脚本模式下运行的命令
    print('正在被作为脚本执行,  __name__ 的值为 __main__')
else:
    # 作为模块导入时运行的命令
    print('正在被作为模块导入, __name__ 的值为', __name__)

import my_module

   在同目录打开命令行,运行

>>> import my_module2
欢迎使用 my_module2.py
正在被作为模块导入, __name__ 的值为 my_module2
欢迎使用 my_module.py
正在被作为模块导入, __name__ 的值为 my_module
>>> my_module2.plus2(2)
4
>>> my_module2.my_module.plus1(2)
3
>>> my_module2.my_module.plus1.__module__
'my_module'
>>> my_module2.plus2.__module__
'my_module2'
# fun.__globals__['__file__'] 可以查看一个函数是在哪个文件中定义的(不能是 builtin 函数)。
>>> my_module2.plus2.__globals__['__file__']
'/mnt/c/Users/addis/Desktop/my_module2.py'
>>> my_module2.my_module.plus1.__globals__['__file__']
'/mnt/c/Users/addis/Desktop/my_module.py'

                     

© 小时科技 保留一切权利