首页 > 其他分享 >py转pyc文件

py转pyc文件

时间:2024-09-18 22:22:46浏览次数:3  
标签:__ 文件 py version file path pyc

import os
import py_compile
import zipfile
import datetime


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文件存储在__pycache__目录中
                        py_compile.compile(full_path, cfile=None, doraise=True)

                        """
                        这个语句的作用是从 __pycache__ 目录中找到与源 .py 文件对应的 .pyc 文件。

具体步骤:

os.listdir(pycache_dir) 列出 __pycache__ 目录下的所有文件。
(f for f in os.listdir(pycache_dir) if f.startswith(file[:-3])) 是一个生成器表达式,过滤掉不符合条件的文件。它会检查 __pycache__ 目录中的每个文件,看看它是否以 file[:-3] 开头。file[:-3] 会去掉 .py 后缀,例如如果 file 是 'example.py',那么 file[:-3] 就是 'example'。
next(..., None) 用来返回第一个匹配条件的文件。如果找不到符合条件的文件,它会返回 None,以防止程序崩溃。
总结一下,这段代码的作用是找到对应 .py 文件的 .pyc 文件名。
                        """
                        # 获取生成的.pyc文件的路径
                        pycache_dir = os.path.join(root, '__pycache__')
                        pyc_file = next(
                            (f for f in os.listdir(pycache_dir) if f.startswith(file[:-3])),
                            None
                        )

                        if pyc_file:
                            pyc_path = os.path.join(pycache_dir, pyc_file)

                            # 在zip文件中保留原始目录结构(去掉__pycache__)
                            target_dir = os.path.relpath(root, file_path)
                            target_pyc_path = os.path.join(target_dir, pyc_file)
                            zipf.write(pyc_path, target_pyc_path)
                            print(f"Added to zip: {target_pyc_path}")

                            # 删除源文件目录中的.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):
    # 创建一个压缩文件
    with zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) as zipf:
        # 查找并编译.py文件并将.pyc文件加入压缩包
        no_list = ['PyToPyc.py']  # 可以将不需要编译的文件加入此列表
        find_py(src_dir, no_list, zipf)


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}")

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


if __name__ == '__main__':
    main()

修改说明: init.py 和 version.py 文件直接打包:

在 find_py() 函数中,添加了一个条件:如果文件是 init.py 或 version.py,则直接将其打包进 .zip 文件,而不进行编译。 其他 .py 文件编译:

对其他 .py 文件进行正常的编译处理,生成 .pyc 文件并打包。 输出: init.py 和 version.py 文件将不再被编译,直接保留原文件形式打包进 .zip 文件。 其他 .py 文件会被编译成 .pyc 文件,并且 .pyc 文件打包进 .zip 文件。 生成的 .zip 文件名会包含文件夹名称、版本号和当前日期,格式如:PYtoPYC.0.6.9ok.yes240918.zip。

标签:__,文件,py,version,file,path,pyc
From: https://blog.51cto.com/u_16420155/12049211

相关文章

  • maven pom文件中的变量定义
    在Maven中,可以使用变量来简化pom.xml文件的维护和管理。这些变量通常被称为属性(properties),可以用来存储经常使用的值,如版本号、依赖库的版本等。使用属性可以使pom.xml更易于管理和维护,并且可以减少出错的机会。下面是如何在pom.xml文件中定义和使用属性的例子......
  • 【FLUX大模型】LORA-马卡龙女孩肖像摄影v1.0(附lora文件及在线使用)
    ​​马卡龙女孩肖像摄影lora​这个马卡龙女孩的lora模型已经上线了,可以直接生成马卡龙配色风格的女性肖像,画面干净温柔,配合人物夸张的特写表情,会显得更有张力,特别适合人物情绪的表达以及时尚单品的广告宣传lora特点这个lora是基于flux大模型训练的,所以在真......
  • 《深度学习》PyTorch框架 优化器、激活函数讲解
    目录一、深度学习核心框架的选择    1、TensorFlow        1)概念        2)优缺点    2、PyTorch                1)概念        2)优缺点    3、Keras           ......
  • 《深度学习》PyTorch 常用损失函数原理、用法解析
    目录一、常用损失函数1、CrossEntropyLoss(交叉熵损失)        1)原理    2)流程        3)用法示例2、L1Loss(L1损失/平均绝对误差)    1)原理        2)用法示例3、NLLLoss(负对数似然损失)    1)原理    2)用法示例......
  • Pyhton调用R语言rpy2包概要
    随着深度学习、大数据和AI的发展,Python的热度持续上升,引发了关于选择Python还是R的讨论。作为数据分析工具,两者各有优缺点。在特定领域,如生态学,R仍被广泛应用,而Python则更多用于日常办公自动化,如批量处理文档和Excel。由于数据处理占用了我们大量时间,很多人希望数据分析操作能够集......
  • D11【python接口自动化学习】-python基础之内置数据类型
    day11列表的常见操作学习日期:20240918学习目标:内置数据类型--20列表的常见操作学习笔记:添加元素#创建列表list_demo=['a','b','c','d']print(type(list_demo))#<class'list'>print(list_demo)#['a','b','c�......
  • 0708,文件流,目录流,MMAP内存映射
    目录目录相关操作目录流及相关操作文件描述符和相关操作fopen()和open()的关系内存映射mmapmmap相关函数01_chdir.c02_mkdir.c03_rewinddir.c04_ftruncate.c05_mmap.c目录相关操作#include<unistd.h>#include<sys/stat.h>#include<sys/types.h>char*getcw......
  • 02. Python基础知识
    一、注释  在开发程序过程中,如果一段代码的逻辑比较复杂,不是特别容易理解,可以适当添加注释,以辅助自己或其他开发人员解读代码。注释是给程序员看的,为了让程序员方便阅读代码,解释器会忽略注释。在Pyton中,注释分为单行注释和多行注释。单行注释:在Python中,使用“#”作为单......
  • Python, 您好世界
    01Python基础概念1-Python语言介绍Python的产生:1991年吉多·范罗苏姆Python的优点:简单易学、全球第一、优雅、应用场景丰富(就业方向多)Python的缺点:执行效率低、第三方库太多2-编程语言的概念什么是编程语言:人类和计算机交流的一种专有领域语言编程语言的工作原理......
  • 使用Python解决对比出两个Excel文件中的不同项并将结果重新写入一个新的Excel文件
    因为有统计成员到会情况的任务,每次汇总时都很麻烦,需要一个个对应腾讯会议导出名单的成员,然后在总表上进行标记,所以就写了本程序来减少统计的复杂度。使用xlrd和xlwt包首先安装两个包pipinstallxlrd==1.2.0pipinstallxlwt==0.7.5定义contrast函数defcontrast(processed_e......