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