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)