使用python编写一个EXE软件(一)

李斯 李斯学python 5月22日

简介

初学python的同学(例如我自己),会以解决日常问题为目的而编写python脚本,练习python的同时也减少了很多重复劳动。

但是,脚本写完之后,如果需要反复使用的话,仍旧会有许多不方便的地方:

  1. 出于不同的目的,我会创立不同的小环境(conda或python虚拟环境)来分隔python模块。每次当我需要调用脚本的时候,就需要激活不同的环境,略嫌麻烦。

  2. 由于实验室,实验周期长的原因,有时候一个脚本一个月才会用到一次,等到下次再使用的时候,往往已经忘记了这个脚本的用法,不得不重新阅读代码,反而增加使用成本。

  3. 当想将写好的脚本分享给其他人的时候,总是会发现他们的电脑上没有配置好环境而无法使用,纯脚本几乎无法共享。

于是通过查阅,还真找到了在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信息已经变为了符合人阅读习惯的格式。

(0)

相关推荐