什么是pyc文件
pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由python的虚拟机来执行的,这个是类似于JAVA或者.NET的虚拟机的概念。
为什么需要使用pyc文件
py文件是可以直接看到源码的,鉴于代码的保密性,所以就需要编译为pyc后,再发布出去。当然,pyc文件也是可以反编译的,不同版本编译后的pyc文件是不同的,根据python源码中提供的opcode,可以根据pyc文件反编译出 py文件源码,网上可以找到一个反编译python,不过你可以自己修改python的源代码中的opcode文件,重新编译 python,从而防止不法分子的破解。目前我采用的是python3.5。
批量生成pyc文件
"""
话不多说 简单介绍一下项目来由及代码功能
1.代码主要是转换py文件为pyc文件保证的代码的基础保密性(没有什么加密是不能破解的成本问题)
2.代码转换后会生成一个压缩包方便携带发送在客户服务器上直接运行
3.py转pyc会有一个非常隐蔽的bug,就是config.ini 以ini结尾的配置文件并不会被保存会在转换过程中被删除
4.pyc是一个非常敏感的小孩子,要保证环境的唯一性,当你转换后不能运行绝大部分都是因为环境问题,那个时候。。。无解重新打包
5.传参过程中,py转pyc可能会出现参数无法传递,主要问题是__pycache__文件夹的影响一定要在转化过程中删除
"""
#-*- encoding=utf8 -*-
import os
import shutil
import tarfile
import compileall
def tar_dir(tar_path):
# 打包压缩
dstname = tar_path+'.tar.gz'
file_name = tar_path.split('/')[-1]
os.chdir(tar_path.split(file_name)[0])
tarHandle=tarfile.open(dstname,"w:gz")
try:
for dirpath,dirs,files in os.walk(tar_path):
for filename in files:
tarHandle.add(os.path.join(file_name+dirpath.split(file_name)[-1],filename))
tarHandle.close()
return dstname
except:
return False
def compile(source,target):
compileall.compile_dir(source)
copyPyc(source,target)
sourceDir = {
#source目录下的无效文件夹
"sourceInvalidDir" : ["__pycache__"]
}
def delFiles(source):
# 递归删除无效文件夹__pycache__
for root , dirs, files in os.walk(source):
for dir in dirs:
if dir in sourceDir["sourceInvalidDir"]:
shutil.rmtree(os.path.join(root, dir))
print ("Delete Dir: " + os.path.join(root, dir))
def copyPyc(source,target):
files= os.listdir(source) #得到文件夹下的所有文件名称
for file in files: #遍历文件夹
if str(file).endswith('.ini'):
shutil.copyfile(os.path.join(source,file),os.path.join(target,file))
dir = os.path.join(source, file)
if os.path.isdir(dir): # 如果是文件夹
target_dir=os.path.join(target,file)
if(not os.path.exists(target_dir)):
if(not os.path.basename(target_dir)=='__pycache__'):
os.makedirs(target_dir)
if(os.path.basename(dir)=='__pycache__'):
for pyc_file in os.listdir(dir):
real_target_dir=str.replace(target,'__pycache__','')
real_pyc_file=str.split(pyc_file,".")[0]+".pyc"
shutil.copyfile(os.path.join(dir,pyc_file),os.path.join(target,real_pyc_file))
else:
copyPyc(dir,target_dir) # 递归执行
if __name__ == "__main__":
abspath = os.path.abspath(__file__)
# source 绝对路径加文件名
source = str(abspath.split('/auto-pyc.py')[0]) + '/dataexa-dl-ccb'
# target 转换后的文件名
target = str(abspath.split('/auto-pyc.py')[0]) + '/dataexa-dl-ccb-pyc'
delFiles(source) # 删除掉所有 __pycache__
if not os.path.exists(target):
os.mkdir(target)
compile(source,target)
tar_dir(target)
#压缩完成后,删除源文件夹
if os.path.exists(target):
shutil.rmtree(target)