不想打包,又不想泄露核心代码怎么办
最简单的方法,被动的生成.pyc文件:
直接把启动项目后,项目的核心代码生成的__pycache__文件夹里对应的 .pyc 预编译文件复制出来,
然后删掉核心代码xxx.py
再把xxx.cpython-39.pyc文件改一下名字改成xxx.pyc
这样项目就能正常跑了!!!
注意.pyc文件的内容跟python的版本相关,不同版本的解释器,编译同样的.py文件生成的.pyc文件是不一样的
#----------------------------------------------------------------------#
还可以使用模块来主动的将.py文件 预编译成.pyc文件
终端输入命令 python -m py_compile test.py
或者运行脚本文件
import py_compile
py_compile.compile('test.py')
这样会在test.py文件所在的目录下,生成一个__pycache__文件夹,
其中存有一个test.cpython-39.pyc文件,
这个pyc文件就是test.py预编译之后生成的文件。
# 将目录下所有py文件转换成pyc文件
一般来说,我们的工程都是在一个目录下的,一般不会说仅仅编译一个py文件而已,
而是需要把整个文件夹下的py文件都编译为pyc文件,python又为了我们提供了另一个模块:compileall
使用方法如下:
import compileall
compileall.compile_dir(r'C:\Users\abc\Desktop\release_project')
也可以使用终端:
python -m compileall C:\Users\abc\Desktop\release_project
这样就会在C:\Users\abc\Desktop\release_project目录下生成一个新的目录__pycache__,
这个目录的下面会存放所有的和python源代码对应的pyc文件
#----------------------------------------------------------------------#
# 目前3.6以后得解释器预编译出.pyc文件,好像没有反模块可以把.pyc文件还原成原.py文件
脚本文件实现将项目里面所有的.py文件预编译成.pyc
其他不是.py的文件直接复制
这样生成的这个dist文件夹里面,
就有该项目能运行的所有文件了
import os
import py_compile
import sys
import shutil
# 将python项目所有.py文件,编译成.pyc文件
def compile_python_files(src_dir, dest_dir, except_file):
# 确保目标目录存在
if not os.path.exists(dest_dir):
os.makedirs(dest_dir)
# 遍历源码目录中的所有文件
for root, dirs, files in os.walk(src_dir):
# root为当前遍历的目录路径
# dirs为当前目录下的子目录列表
# files为当前目录下的文件列表
for file in files:
# 检查文件是否为 .py 文件
if file.endswith('.py') and file not in except_file:
# 构建当前 .py 文件的完整路径
py_file_path = os.path.join(root, file)
# 构建对应的 .pyc 文件路径 [:-3]去掉.py 换成.pyc
pyc_file_path = py_file_path[:-3] + '.pyc'
# 构建 .pyc文件 所在的目标目录路径
# os.path.relpath(pyc_file_path, src_dir)就是把.pyc文件完整路径去掉根路径前面的一截
pyc_file_path = os.path.join(dest_dir, os.path.relpath(pyc_file_path, src_dir))
# 确保 .pyc 文件所在的目录存在
dirname = os.path.dirname(pyc_file_path)
if not os.path.exists(dirname):
os.makedirs(dirname)
# 编译 .py 文件为 .pyc 文件
py_compile.compile(py_file_path, cfile=pyc_file_path, doraise=True)
else:
# 如果文件名不是 .py,将文件复制到 dest_dir 目录下
# 构建当前 非.py 文件的完整路径
src_file_path = os.path.join(root, file)
# 构建在目标目录中的文件路径
dest_file_path = os.path.join(dest_dir, os.path.relpath(src_file_path, src_dir))
# 确保 该非.py 文件所在的目录存在
if not os.path.exists(os.path.dirname(dest_file_path)):
os.makedirs(os.path.dirname(dest_file_path))
# 复制进去
shutil.copy(src_file_path, dest_file_path)
print("Compilation complete.")
# 将单个.py文件,编译成.pyc文件
file_dir='C:/Users/10596/Desktop/server-suzhougaotienewcity_test/serve_flask_dev.py'
def compile_file(file_dir):
py_compile.compile(file_dir)
print("Compilation complete.")
if __name__ == "__main__":
# 设置源码目录和目标目录
src_dir = 'C:/Users/10596/Desktop/server-suzhougaotienewcity_test' # 你的Python项目目录路径
dest_dir = './dist' # 你想存放 .pyc 文件的目录
except_file = ['settings.py', '__init__.py']
compile_python_files(src_dir, dest_dir, except_file)
# compile_file(file_dir)
用cython模块直接对python代码加密成.pyd文件
# python代码加密 最简单
# 把.py 文件名改成 .pyx文件名
比如 shenjieyun.pyx
def add(a,b):
return a+b
def sub(a,b):
return a-b
def mul(a,b):
return a*b
def div(a,b):
return a/b
# 再写个setup.py文件
# file: setup.py
from distutils.core import setup, Extension
from Cython.Build import cythonize
# name表示扩展模块的名称
ext = Extension(name='shenjieyun',
sources=['shenjieyun.pyx'])
setup(ext_modules=cythonize(ext))
# 直接编译
python setup.py build_ext --inplace
# 生成的 .pyd 文件就能直接作为导入文件使用了
脚本文件自动将对应目录下的所有.py文件转化成.pyd文件,
并保存到对应的目录下,还保留原目录的文件结构
from Cython.Build import cythonize
from distutils.extension import Extension
from distutils.core import setup
import os
import shutil
# 将python项目所有.py文件, 编译成.pyd文件
def compile_python_files(input_directory, output_directory, except_file):
# 确保目标目录存在
if not os.path.exists(output_directory):
os.makedirs(output_directory)
# 遍历源码目录中的所有文件
for root, dirs, files in os.walk(input_directory):
# root为当前遍历的目录路径
# dirs为当前目录下的子目录列表
# files为当前目录下的文件列表
for file in files:
# 检查文件是否为 .py 文件
if file.endswith('.py') and file not in except_file:
# 获取文件名称hello.py 再分离出文件名hello
module_name = os.path.splitext(file)[0]
# 构建当前 .py 文件的完整路径
py_file_path = os.path.join(root, file)
# 构建对应的 .pyd 文件路径 [:-3]去掉.py 换成.pyd
pyd_file_path = py_file_path[:-3] + '.pyd'
# 构建 .pyd文件 所在的目标目录路径
# os.path.relpath(pyd_file_path, src_dir)就是把.pyd文件完整路径去掉根路径前面的一截
fin_pyd_file_path = os.path.join(output_directory, os.path.relpath(pyd_file_path, input_directory))
# 确保 .pyc 文件所在的目录存在
dirname = os.path.dirname(fin_pyd_file_path)
if not os.path.exists(dirname):
os.makedirs(dirname)
# 编译 .py 文件为 .pyd 文件
ext = Extension(module_name, [py_file_path])
# 调用 setup 函数编译 Extension 对象并生成 .pyd 文件
setup(
ext_modules=cythonize(ext),
script_args=["build_ext", "--build-lib", dirname]
)
else:
# 如果文件名不是 .py,或是要排除不编译的.py文件 将文件复制到 output_directory 目录下
# 构建当前文件的完整路径
old_copy_file_path = os.path.join(root, file)
# 构建在目标目录中的文件路径
new_copy_file_path = os.path.join(output_directory, os.path.relpath(old_copy_file_path, input_directory))
# 确保该文件所在的目录存在
if not os.path.exists(os.path.dirname(new_copy_file_path)):
os.makedirs(os.path.dirname(new_copy_file_path))
# 复制进去
shutil.copy(old_copy_file_path, new_copy_file_path)
print("Compilation complete.")
if __name__ == "__main__":
input_directory = "C:/Users/10596/Desktop/server-5granuepositioning/shenjieyun" # 指定输入目录
output_directory = "C:/Users/10596/Desktop/server-5granuepositioning/shenjieyun_dist" # 指定输出目录
except_file = ['settings.py', '__init__.py'] # 指定不编译的.py文件
compile_python_files(input_directory, output_directory, except_file)
print("所有 .py 文件转换为 .pyd 文件完成")
标签:文件,加密,os,py,file,path,pyc,方法,打包
From: https://www.cnblogs.com/tengyifan888/p/18530694