使用python编写一个EXE软件(一)
李斯 李斯学python 5月22日
简介
初学python的同学(例如我自己),会以解决日常问题为目的而编写python脚本,练习python的同时也减少了很多重复劳动。
但是,脚本写完之后,如果需要反复使用的话,仍旧会有许多不方便的地方:
出于不同的目的,我会创立不同的小环境(conda或python虚拟环境)来分隔python模块。每次当我需要调用脚本的时候,就需要激活不同的环境,略嫌麻烦。
由于实验室,实验周期长的原因,有时候一个脚本一个月才会用到一次,等到下次再使用的时候,往往已经忘记了这个脚本的用法,不得不重新阅读代码,反而增加使用成本。
当想将写好的脚本分享给其他人的时候,总是会发现他们的电脑上没有配置好环境而无法使用,纯脚本几乎无法共享。
于是通过查阅,还真找到了在Windows下的有局限的解决方法——将写好的脚本与python、模块、解释器打包,输出一个可以在Windows电脑中直接使用的EXE文件。
接下来就以一个获取文件大小的脚本为实例,将整个流程记录下来。
依赖环境
Python3+
代码
先写一个获取目录下所有文件大小,然后输出的脚本。
import os # 1
class GetSize: # 2 """获取文件大小并输出"""
def __init__(self, working_dir): os.chdir(working_dir) # 3 self.files = [file for file in os.listdir() if os.path.isfile(file)] # 4 self.size_dict = {}
def size(self): """获取文件大小""" for file in self.files: self.size_dict[file] = os.path.getsize(file) # 5
def write_result(self): """将文件大小信息写入txt中""" with open(f'{os.path.split(os.getcwd())[1]}-file_size.txt', 'w') as f: lines = '' for name, size in self.size_dict.items(): line = f'{name}\t{size}\n' lines += line # 6 f.write(lines) # 7
g = GetSize('E:\LSA') # 8g.size()g.write_result() # 9
#1导入os模块。
#2使用class定义一个GetSize类。
#3使用os.chdir()
函数将工作目录转换为输入的working_dir。
#4使用列表生成式,获取工作目录下的所有文件名。
#5for循环,对每个文件使用os.path.getsize()
函数获取其文件大小信息,并且与文件名组合成字典,储存于self.size_dict
中。
#6、#7将文件名与size信息写入txt文件中。
#8调用GetSize类,并且指定working_dir为'E:\LSA'。
#9依次使用GetSize类中的方法,输出txt文件。
运行后可以得到一个txt文本文件,打开可以看到内容如下:
文件名与文件大小,中间用制表符(tab)分隔。
这个简单的脚本虽然可以输出文件大小,但是大小信息是以字节(bytes)为单位写入的,不适合人阅读。
接下来对脚本进行修改,使其输出适合人类阅读的大小信息:
import osimport math # 1
def convert_size(size_bytes): # 2 """将文件大小转换为人类可读的格式""" if size_bytes == 0: return "0B" size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB") # 3 i = int(math.floor(math.log(size_bytes, 1024))) # 4 p = math.pow(1024, i) # 5 s = round(size_bytes / p, 2) # 6 return "%s %s" % (s, size_name[i]) # 7
class GetSize: """获取文件大小并输出"""
--snip--
for name, size in self.size_dict.items(): line = f'{name}\t{convert_size(size)}\n' # 8 lines += line f.write(lines)
g = GetSize('E:\LSA')g.size()g.write_result()
#1处导入了新模块math,用于后续对size_bytes的计算。
#2新定义了convert_size函数,用以将文件大小转换为人类可读的格式。
#3列出了常用的文件大小单位。
#4使用math.log()
函数,求出以1024为底,size_bytes的对数,再用math.floor()
函数保留对数的下舍数(下舍数即:100.5 -> 100,可以理解为取数字的整数部分。)用int()
函数返回数字储存在i中。
#5使用math.pow()
函数,返回1024的i次幂,储存在p中。
#6用size_bytes 除以 p,并通过round()
函数以四舍五入的形式保留两位小数:round(int, 2)
,储存在s中。
#7返回结果。
#8调用刚才定义的convert_size函数,将size转为人类可读的格式,写入txt中。
修改后的脚本输出的文件大小结果为:
可以看到输出的size信息已经变为了符合人阅读习惯的格式。