首页 > 其他分享 >py转pyc,改进版

py转pyc,改进版

时间:2024-09-23 22:51:18浏览次数:3  
标签:pyc zip py version file path folder 改进版

import os
import py_compile
import zipfile
import datetime


def add_custom_folder_to_zip(custom_folder, zipf, base_path):
    """
    将自定义文件夹添加到压缩文件中,保留原始目录结构。
    :param custom_folder: 自定义文件夹路径
    :param zipf: 压缩文件对象
    :param base_path: 项目根目录,用于保持相对路径
    """
    for root, dirs, files in os.walk(custom_folder):
        for file in files:
            full_path = os.path.join(root, file)
            # 保留相对于项目根目录的路径结构
            arcname = os.path.relpath(full_path, base_path)
            zipf.write(full_path, arcname)
            print(f"Added {file} from custom folder to zip: {arcname}")


def get_version(version_file_path):
    """从version.py文件中提取__version__的值"""
    version = ""
    with open(version_file_path, 'r', encoding='utf-8') as f:
        for line in f:
            if line.startswith("__version__"):
                # 提取 __version__ 后面的值,去掉引号和空格
                version = line.split('=')[1].strip().strip("'").replace(" ", "")
                break
    return version


def find_py(file_path, no_list, zipf):
    # 遍历目录及其子目录,查找所有.py文件
    for root, dirs, files in os.walk(file_path):
        for file in files:
            if file.endswith('.py'):
                full_path = os.path.join(root, file)

                # 如果是__init__.py或version.py文件,直接打包,不编译
                if file == '__init__.py' or file == 'version.py':
                    arcname = os.path.relpath(full_path, file_path)
                    zipf.write(full_path, arcname)
                    print(f"Added {file} to zip: {arcname}")
                    continue

                # 对其他.py文件进行编译处理
                if file not in no_list:
                    try:
                        # 创建与.py文件对应的.pyc文件路径
                        pyc_file = file[:-3] + '.pyc'  # 将.py替换为.pyc
                        pyc_path = os.path.join(root, pyc_file)

                        # 编译.py文件,直接生成与.py文件对应的.pyc文件
                        py_compile.compile(full_path, cfile=pyc_path, doraise=True)

                        # 在zip文件中保留原始目录结构
                        arcname = os.path.relpath(pyc_path, file_path)
                        zipf.write(pyc_path, arcname)
                        print(f"Added to zip: {arcname}")

                        # 删除源文件目录中的.pyc文件
                        os.remove(pyc_path)
                    except py_compile.PyCompileError as e:
                        print(f"Error compiling {full_path}: {e}")


def file_to_zip(src_dir, zip_name, custom_folder=None):
    # 创建一个压缩文件
    with zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) as zipf:
        # 查找并编译.py文件并将.pyc文件加入压缩包
        no_list = ['PyToPyc.py']  # 可以将不需要编译的文件加入此列表
        find_py(src_dir, no_list, zipf)

        # 如果有自定义文件夹,则将该文件夹也添加到压缩包中
        if custom_folder and os.path.exists(custom_folder):
            add_custom_folder_to_zip(custom_folder, zipf, src_dir)


def main():
    file_path = os.getcwd()  # 当前项目根目录
    print(f"Current directory: {file_path}")

    # 获取文件路径的最后一级目录名称
    folder_name = os.path.basename(file_path)

    # 从 version.py 文件中提取版本号
    version_file_path = os.path.join(file_path, 'version.py')
    version = get_version(version_file_path)

    # 获取当前日期并格式化为"年月日"格式
    current_date = datetime.datetime.now().strftime('%y%m%d')
    print(current_date)

    # 生成zip文件名
    zip_name = f"{folder_name}.{version}.build{current_date}.zip"
    print(f"Generated zip name: {zip_name}")

    # 自定义文件夹路径(使用完整路径,保留父目录结构)
    custom_folder = os.path.join(file_path, './test/cccd/task')

    # 创建压缩包并将.pyc文件、version.py、__init__.py文件和自定义文件夹打包进去
    file_to_zip(file_path, zip_name, custom_folder=custom_folder)
    print('All .pyc, version.py, __init__.py files and custom folder have been zipped.')


if __name__ == '__main__':
    main()

标签:pyc,zip,py,version,file,path,folder,改进版
From: https://blog.51cto.com/u_16420155/12092180

相关文章

  • 办公自动化 + pyautogui
    Python在办公自动化方面有广泛的应用,能够帮助我们自动处理重复性任务、提高效率。以下是几个典型的Python办公自动化例子:1.Excel自动化处理使用pandas或openpyxl等库可以方便地进行Excel表格的读取、处理、生成和修改操作。示例:批量处理Excel表格中的数据importp......
  • Python背记内容-1day
    变量命名需要遵循以下这些规则,这些规则又分为必须遵守的硬性规则和建议遵守的非硬性规则。硬性规则:规则1:变量名由字母、数字和下划线构成,数字不能开头。需要说明的是,这里说的字母指的是Unicode字符,Unicode称为万国码,囊括了世界上大部分的文字系统,这也就意味着中文、日文、希腊......
  • Pyside6——.ui文件通过uic转化得到.py文件不可用的一个原因
    1.问题描述在QtDesigner设计得到的.ui文件通过uic转化成.py文件后不能运行,仔细检查发现得到的代码不符合Python代码的特征。如在vscode环境中,右键点击.ui文件选择PYQT:compilefrom进行编译得到.py文件。2.可能的原因——在导入uic工具时路径选错检查发现uic等工具路径错误......
  • Python——第三方库不能用
    1.问题描述通过pip安装第三方库成功后,在pycharm中在.py文件导入第三方库显示没有这个库。2.解决方法2.1.情况1检查是否在创建项目时开启了虚拟环境。若开启了虚拟环境,项目文件夹会出现如图文件夹:此时有两种方法解决。方法1.直接在Python安装目录中找到需要的库,复制粘贴......
  • Python数据库连接池dbutils详解
    简介在python开发中,如果需要连接MySQL数据库并进行数据操作,可以使用dbutils模块,dbutils是python的一个数据库工具库下载对应模块pipinstallpymysqlpipinstalldbutils连接池配置信息说明使用示例importpymysqlfrompymysql.cursorsimportDictCursorfr......
  • Python中的“打开与关闭文件”:从入门到精通
    引言在日常生活中,我们经常会遇到需要读取或保存信息的情况,比如记录笔记、保存配置信息或者处理大量的数据文件等。对于程序员来说,如何高效、安全地管理这些信息显得尤为重要。Python中的文件操作功能强大且易于使用,可以帮助我们轻松完成各种任务。本文将详细介绍Python中打开与关......
  • Python中的文件读取艺术:从新手到高手的全面指南
    引言读取文件是任何编程语言中最基本也是最重要的功能之一。在日常开发工作中,我们常常需要处理各种类型的文件,如文本文件、CSV文件、JSON文件等。Python作为一门简洁易学的语言,在处理文件方面提供了非常强大的工具。无论是简单的日志分析、数据清洗还是复杂的机器学习任务,都能通过......
  • 为什么网上Python爬虫教程这么多,但是做爬虫的这么少呢?
    专业的爬虫已经有搜索公司、数据公司在做了,像百度、搜狗、德勤等等,相关的程序员岗位也不少。但大多数场景下都只需要简单的爬虫,数据量小、难度低,这样简单的爬虫压根不需要专门的人才,不管用Python,还是用爬虫软件,在很短的时间里都能搞定。其实爬虫无外乎抓包工具、解析工具、HTM......
  • python爬虫案例——抓取链家租房信息
    文章目录1、任务目标2、分析网页3、编写代码1、任务目标目标站点:链家租房版块(https://bj.lianjia.com/zufang/)要求:抓取该链接下前5页所有的租房信息,包括:标题、详情信息、详情链接、价格如:2、分析网页用浏览器打开链接,按F12或右键检查,进入开发者模式;因......
  • Scrapy爬取链家数据(二):爬取小区详细信息
    前言    上一篇文章中有朋友问不能正确获取页面,一个原因是没有设置不遵守爬虫协议,设置方法如下,在settings.py文件中,将图中字段设置为False即可:#Obeyrobots.txtrulesROBOTSTXT_OBEY=False        在上一篇文章中,我们通过相关命令,引入了Scrapy框架,并且成......