今天我们来学习dummy文件夹下CLI-TOOL里的run_shell.py文件。
首先,引入了一些模块,其中,from __future__ import print_function是python中一种特殊的用法,可以将print
函数从Python 3引入到Python 2中。通过在Python 2代码的开头添加from __future__ import print_function
语句,可以使用Python 3风格的print
函数来代替Python 2中的print
语句。这样可以使代码更加兼容Python 3,并且减少迁移到Python 3的工作量。
#!/usr/bin/env python3 #检查现在环境中的python是否为3.0或者更高版本,如果不是,打印一条错误信息并退出脚本
from __future__ import print_function #将print函数从Python 3引入到Python 2中
import argparse #解析命令行参数
import os #与操作系统进行交互
import sys #访问与python解释器相关的功能
import time #处理时间
接下来,代码将一个特定路径添加到Python解释器的模块搜索路径中,然后导入了一些模块,并对print
函数进行了备份。
sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(
os.path.realpath(__file__))),
"Firmware", "fibre", "python"))
from fibre import Logger, Event #从fibre模块中导入Logger和Event类。
import ref_tool #导入ref_tool模块
from ref_tool.configuration import * #导入ref_tool模块中configuration模块的所有内容
old_print = print #将当前的print函数赋值给变量old_print(相当于对print函数进行备份)
代码的第一句比较长,让我们来仔细看一下。
sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(
os.path.realpath(__file__))),
"Firmware", "fibre", "python"))
当编写Python代码时,我们可能会使用不同的模块和库来实现特定的功能。为了能够正确地导入这些模块,Python需要知道模块所在的路径。Python维护了一个系统路径列表,其中包含了Python解释器用来搜索模块的路径。当我们使用import
语句导入模块时,Python会按照系统路径列表的顺序依次搜索,直到找到对应的模块为止。
然而,有时候我们需要在系统列表中添加新路径,以便能够正确地导入自定义的模块或库。这时候,我们就可以通过将新的路径插入到系统路径列表的开头来实现。具体操作如下:
代码中,
os.path.realpath()
函数用于获取当前文件的绝对路径。- os.path.dirname()函数用于获取当前文件的父目录的路径。
- 再用一次os.path.dirname()函数,再次用于获取上一次获得目录的父目录(可以理解为最终获取了一个祖父目录)。
- 接下来,通过os.path.join()函数,将上一步得到的目录路与"Firmware/fibre/python"拼接,得到完整的路径。
最后,通过sys.path.insert()函数,
将上一步得到的路径添加到Python解释器的模块搜索路径中,即将该路径作为第一个搜索路径,使得Python解释器在搜索模块时会先搜索该路径下的模块。
接下来,定义了一个自定义的print
函数,,它的作用是在打印内容后刷新输出缓冲区。
def print(*args, **kwargs): #定义了一个自定义的print函数
kwargs.pop('flush', False) #从kwargs字典中删除键为'flush'的项,如果不存在该键则返回False
old_print(*args, **kwargs) #将传入的位置参数和关键字参数原封不动地传递给old_print函数
file = kwargs.get('file', sys.stdout) #从kwargs字典中获取键为'file'的值,如果不存在该键则返回sys.stdout对象
file.flush() if file is not None else sys.stdout.flush() #如果file对象不为None,则调用其flush()方法刷新输出缓冲区;
# 否则,直接调用sys.stdout.flush()方法刷新标准输出缓冲区。
其中, kwargs.pop('flush', False)是为了避免在调用old_print
函数时传递了无法识别的参数file = kwargs.get('file', sys.stdout)是为了获取打印输出的文件对象,如果没有指定则默认为标准输出。
然后,获取当前脚本文件父目录的路径。
script_path = os.path.dirname(os.path.realpath(__file__))
代码的第一部分就完啦,接下来就是用Python的argparse
模块来创建一个命令行解析器对象以及为解析器对象添加一些通用参数,然后重要的command的部分,就在下一章为大家继续讲解吧。