12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- import os
- import shutil
- from distutils.core import setup
- from Cython.Build import cythonize
- """运行方式:
- python setup.py build_ext --inplace
- """
- # 遍历搜索目录下所有".py"文件并删除"__pycache__"文件夹
- def path_search(root_path, pylist, exclude_list, suffix=".py"):
- # 删除"__pycache__"文件夹下".pyc"文件,防止被反编译
- pycache_path = os.path.join(root_path, "__pycache__")
- shutil.rmtree(pycache_path) if os.path.exists(pycache_path) else None
- # 获取当前目录下的所有文件集合
- file_list = os.listdir(root_path)
- # 遍历搜索目录下所有".py"文件
- for file in file_list:
- # 路径拼接
- path = os.path.join(root_path, file)
- # 若path是目录则,向下搜索
- if os.path.isdir(path):
- pylist = path_search(path, pylist, exclude_list)
- # 判断文件名是否以".py"结尾,并且不是排除文件
- elif file.endswith(suffix) and file not in exclude_list:
- pylist.append(path)
- return pylist
- # 生成cython加密文件
- def setup_func(pylist, exclude_list):
- # 注意这里推荐使用相对路径,编译出的so文件在引用其他模块时可能会出现路径问题
- setup(ext_modules=cythonize(pylist, exclude=exclude_list))
- # 清理setup生成的临时文件
- def clean_setup_file(root_path, pylist):
- # 删除"build"文件夹
- shutil.rmtree("build")
- # 获取主目录下的所有".so"或".pyd"文件集合
- file_list = os.listdir(root_path)
- cylist = [f for f in file_list if f.endswith((".so", ".pyd"))]
- # 删除非排除".py"和".c"文件
- for pypath in pylist:
- os.remove(pypath)
- os.remove(pypath[:-3] + ".c")
- # ".py"文件路径分割
- split_pypath = os.path.split(pypath)
- # 移动".so"或".pyd"文件到相应文件夹中
- for cyfile in cylist:
- if cyfile.startswith(split_pypath[1][:-3]) is True:
- # 判断".so"或".pyd"文件路径是否与根路径相同,若不同则移动文件
- if os.path.samefile(split_pypath[0], root_path) is False:
- shutil.move(cyfile, split_pypath[0])
- break
- # 删除"setup.py"文件
- os.remove("setup.py")
- if __name__ == "__main__":
- # 获取当前路径
- root_path = os.getcwd()
- # 预先复制原文件
- split_path = os.path.split(root_path)
- copy_path = os.path.join(split_path[0], split_path[1] + "_copy")
- if os.path.exists(copy_path) is False:
- shutil.copytree(root_path, copy_path)
-
- # 非加密".py"文件列表
- exclude_list=["setup.py", "__init__.py", "config.py", "guc_conf.py",
- "retrieval_monitor.py", "restart_server.py"]
- # 获取当前目录下的所有"app.py"文件加入exclude_list列表
- os.chdir(copy_path)
- file_list = os.listdir(copy_path)
- exclude_list.extend([f for f in file_list if f.endswith("app.py")])
-
- # 需要setup加密的".py"文件列表
- pylist = []
- # 遍历搜索目录下所有py文件并返回列表
- pylist = path_search(copy_path, pylist, exclude_list)
- # 生成cython加密文件
- setup_func(pylist, exclude_list)
- # 清理setup生成的临时文件
- clean_setup_file(copy_path, pylist)
|