setup.py 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import os
  2. import shutil
  3. from distutils.core import setup
  4. from Cython.Build import cythonize
  5. """运行方式:
  6. python setup.py build_ext --inplace
  7. """
  8. # 遍历搜索目录下所有".py"文件并删除"__pycache__"文件夹
  9. def path_search(root_path, pylist, exclude_list, suffix=".py"):
  10. # 删除"__pycache__"文件夹下".pyc"文件,防止被反编译
  11. pycache_path = os.path.join(root_path, "__pycache__")
  12. shutil.rmtree(pycache_path) if os.path.exists(pycache_path) else None
  13. # 获取当前目录下的所有文件集合
  14. file_list = os.listdir(root_path)
  15. # 遍历搜索目录下所有".py"文件
  16. for file in file_list:
  17. # 路径拼接
  18. path = os.path.join(root_path, file)
  19. # 若path是目录则,向下搜索
  20. if os.path.isdir(path):
  21. pylist = path_search(path, pylist, exclude_list)
  22. # 判断文件名是否以".py"结尾,并且不是排除文件
  23. elif file.endswith(suffix) and file not in exclude_list:
  24. pylist.append(path)
  25. return pylist
  26. # 生成cython加密文件
  27. def setup_func(pylist, exclude_list):
  28. # 注意这里推荐使用相对路径,编译出的so文件在引用其他模块时可能会出现路径问题
  29. setup(ext_modules=cythonize(pylist, exclude=exclude_list))
  30. # 清理setup生成的临时文件
  31. def clean_setup_file(root_path, pylist):
  32. # 删除"build"文件夹
  33. shutil.rmtree("build")
  34. # 获取主目录下的所有".so"或".pyd"文件集合
  35. file_list = os.listdir(root_path)
  36. cylist = [f for f in file_list if f.endswith((".so", ".pyd"))]
  37. # 删除非排除".py"和".c"文件
  38. for pypath in pylist:
  39. os.remove(pypath)
  40. os.remove(pypath[:-3] + ".c")
  41. # ".py"文件路径分割
  42. split_pypath = os.path.split(pypath)
  43. # 移动".so"或".pyd"文件到相应文件夹中
  44. for cyfile in cylist:
  45. if cyfile.startswith(split_pypath[1][:-3]) is True:
  46. # 判断".so"或".pyd"文件路径是否与根路径相同,若不同则移动文件
  47. if os.path.samefile(split_pypath[0], root_path) is False:
  48. shutil.move(cyfile, split_pypath[0])
  49. break
  50. # 删除"setup.py"文件
  51. os.remove("setup.py")
  52. if __name__ == "__main__":
  53. # 获取当前路径
  54. root_path = os.getcwd()
  55. # 预先复制原文件
  56. split_path = os.path.split(root_path)
  57. copy_path = os.path.join(split_path[0], split_path[1] + "_copy")
  58. if os.path.exists(copy_path) is False:
  59. shutil.copytree(root_path, copy_path)
  60. # 非加密".py"文件列表
  61. exclude_list=["setup.py", "__init__.py", "config.py", "guc_conf.py",
  62. "retrieval_monitor.py", "restart_server.py"]
  63. # 获取当前目录下的所有"app.py"文件加入exclude_list列表
  64. os.chdir(copy_path)
  65. file_list = os.listdir(copy_path)
  66. exclude_list.extend([f for f in file_list if f.endswith("app.py")])
  67. # 需要setup加密的".py"文件列表
  68. pylist = []
  69. # 遍历搜索目录下所有py文件并返回列表
  70. pylist = path_search(copy_path, pylist, exclude_list)
  71. # 生成cython加密文件
  72. setup_func(pylist, exclude_list)
  73. # 清理setup生成的临时文件
  74. clean_setup_file(copy_path, pylist)