python文件加密


title: python文件加密
top: 41
date: 2024-05-23 10:06:12
tags:

  • python
  • 加密
    categories:
    -python

import argparse
import os
import sys
import shutil

if sys.platform == 'linux':
    SUF = '.cpython-310-x86_64-linux-gnu.so'
else:
    SUF = '.cp39-win_amd64.pyd'


def py2so(files=None, directory=None, ignore_files=None, des_dir=None, delete=False):
    """
    files : list/iterate
    directory : str
    ignore_files : list/iterate
    des_dir : str
    delete : bool
    """
    from distutils.core import setup
    from Cython.Build import cythonize

    if files is None and directory is None:
        raise ValueError("ERROR: [Stage py2so]Cannot find any files, for both of 'files' and 'directory' is None")
    if files is not None:
        files = files
    elif directory is not None:
        root, _, files = next(os.walk(directory))
        files = [os.path.join(root, file) for file in files if file.endswith('.py')]
    ignore_files = ignore_files if ignore_files is not None else ()
    files = [file for file in files if os.path.split(file)[1] not in ignore_files]
    global SUF
    sys.argv = sys.argv[0:1]
    sys.argv.extend(['build_ext', 'clean'])
    setup(ext_modules=cythonize(files, language_level=3))
    libDir = os.path.join('build', os.listdir('build')[0])
    for file in files:
        path, fileName = os.path.split(file)
        name = '.'.join(fileName.split('.')[:-1])
        if os.path.isfile(os.path.join(path, name + '.c')):
            os.remove(os.path.join(path, name + '.c'))
        if delete:
            os.remove(file)
        des_dir = path if des_dir is None else des_dir
        des = os.path.join(des_dir, name + SUF)
        if os.path.exists(des):
            os.remove(des)
        shutil.move(os.path.join(libDir, name + SUF), des_dir)


def clean(directory=None):
    shutil.rmtree('build', ignore_errors=True)
    if directory is not None:
        global SUF
        root, _, files = next(os.walk(directory))
        files = [os.path.join(root, file) for file in files if file.endswith(SUF)]
        for file in files:
            os.remove(file)


def setupPy(files):
    """files : list/iterate"""
    for file in files:
        path, fileName = os.path.split(file)
        name = '.'.join(fileName.split('.')[:-1])
        lines = ["import sys",
                 f"import {name}\n",
                 "sys.tracebacklimit = 0",
                 f"sys.exit({name}.main())"
                 ]
        if sys.platform == 'linux':
            lines.insert(0, "#!/usr/bin/env python3")
        if os.path.exists(file):
            os.remove(file)
        with open(file, 'w') as fw:
            fw.write('\n'.join(lines) + '\n')


def main(src_file, des_dir, setup_file=False):
    py2so([src_file], des_dir=des_dir)
    clean()
    if setup_file:
        file = os.path.join(des_dir, os.path.basename(src_file))
        setupPy([file])


def args_parser():
    parser = argparse.ArgumentParser(description='python files encryption')
    parser.add_argument('-f', required=True,  help='encryption source file')
    parser.add_argument('-d', required=True, help='encryption file store directory')
    parser.add_argument('-p', action='store_true', help='generate setup python file')
    return parser.parse_args()


if __name__ == '__main__':
    args = args_parser()
    src, des, py = args.f, args.d, args.p
    main(src, des, py)

参考链接

[]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值