首页 > 其他分享 >项目不打包加密方法

项目不打包加密方法

时间:2024-11-06 17:48:48浏览次数:1  
标签:文件 加密 os py file path pyc 方法 打包

不想打包,又不想泄露核心代码怎么办

最简单的方法,被动的生成.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

相关文章

  • 商密学习-分组密码加密模式笔记
    利于并行:ECB(加解密均利于并行)、CTR(加解密均并行)不利于并行:CBC(加密串行,解密可并行)、CFB(加密串行,解密可并行)、OFB(不可并行,每个密钥流块的生成依赖于前一个块的结果)需要填充:ECB、CBC不需要填充:CFB、OFB、CTR错误有扩散:CBC(加密过程错误影响随后所有,解密过程长度不改变最多影响两个......
  • Flutter 项目一键打包多个渠道包的实现
    前言在移动开发中,通常需要对应用进行不同渠道的打包,以满足多平台推广需求。本文将介绍如何通过一键打包脚本,实现Flutter项目多渠道打包,并生成指定的渠道APK文件。效果图:实现步骤1.定义渠道索引和名称首先在代码中定义一个渠道索引和渠道名称的数组,以便在打包时区......
  • python项目打包指南
    #Python是解释型语言,我们写的Flask或Django项目如果部署,#源码可能会泄露,因此我们可以把项目打包成exe,来保护源码#需要用到工具-pyinstaller:把python项目打包成不同平台的可执行文件-nsis:NSIS(NullsoftScriptableInstallSystem)是一个开源的Windows系统下安装程序制作......
  • 海康私有化视频平台EasyCVR私有化部署视频平台支持国密35114协议有哪些关键加密技术?
    随着信息技术的飞速发展,视频监控系统在保障公共安全和提升管理效率方面扮演着越来越重要的角色。然而,视频数据的安全问题也日益凸显,如何确保视频数据的安全性、完整性和真实性成为了一个迫切需要解决的问题。海康私有化视频平台EasyCVR作为一款支持私有化部署的视频平台,其对国密......
  • rsmhook64.dll文件丢失不再烦恼,这些方法帮你轻松解决
    rsmhook64.dll文件的缺失可能会导致某些应用程序无法正常运行。这里提供几种可能的解决方法,帮助您修复这个问题:1.重新安装相关软件如果rsmhook64.dll文件是某个特定程序的一部分,尝试卸载并重新安装该程序。这通常可以解决由于文件损坏或丢失引起的大多数问题。2.使用......
  • 《古剑奇谭网络版》qt5widgets.dll文件丢失全方位解决方法大全
    《古剑奇谭网络版》是一款大型多人在线角色扮演游戏。如果在运行该游戏时遇到qt5widgets.dll文件丢失的错误提示,这通常意味着你的系统缺少了Qt框架中的一个必要组件。Qt是一个跨平台的应用程序开发框架,广泛用于图形用户界面(GUI)的创建。要解决qt5widgets.dll文件丢失的问题,你可......
  • es6 flat 将数组降维方法
    flat()是JavaScript中的一个数组方法,用于将嵌套的数组“拉平”成一个新数组。该方法会递归地“降维”数组,直到指定的深度。语法:arr.flat(depth);depth:可选,表示嵌套数组的“深度”。默认为1。传入一个更大的值,数组会被拉平更多层级。如果传入Infinity,则会将所有嵌套的数......
  • 一文带您了解SonarScanner的原理和使用方法(包括maven构建和命令行执行)
    SonarScanner扫描代码SonarScanner执行源代码分析。这个独立的程序在CI/CD主机上运行,并将分析结果发送到SonarQube服务器,由其计算分析结果,计算质量门并生成报告。为了执行分析,SonarScanner使用安装时从SonarQube服务器下载的语言分析器。SonarScanner和SonarQube二者的关系,通......
  • C#SM4加密算法
    1.管理NuGet程序包,搜索BouncyCastle,安装2.代码示例//加密算法:SM4//加密模式:ECB//填充模式:PKCS5Padding//编码类型:UTF-8///<summary>///加密///</summary>///<paramname="plainText"></param>///<par......
  • cv2.threshold利用OSTU方法分割图像的前景和背景
    OSTU方法,又称大津法或最大类间方差法,是一种在图像处理中广泛应用的自动阈值选择方法。该方法由日本学者大津(NobuyukiOtsu)于1979年提出,旨在通过最大化前景与背景之间的类间方差来自动确定一个最佳阈值,从而将图像分割成前景和背景两部分。OSTU方法的核心思想是寻找一个阈值T,使......