setup.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. """
  2. 安装程序
  3. 1) 检查python版本
  4. 2) 复制文件到安装目录
  5. 3) 生成启动文件
  6. """
  7. import os
  8. import sys
  9. import warnings
  10. import shutil
  11. if sys.version_info.major != 3:
  12. warnings.warn("请使用 Python3 运行程序") # 使用 warning 确保 python2 可以输出提示
  13. exit(1)
  14. if sys.version_info.minor < 9:
  15. warnings.warn("建议使用python3.9以上版本")
  16. if len(sys.argv) == 1:
  17. print("请指定安装目录", file=sys.stderr)
  18. exit(1)
  19. install_prefix = sys.argv[1]
  20. if install_prefix.endswith(os.sep) or install_prefix.endswith('/'):
  21. install_prefix = os.path.join(install_prefix[:-1], "HGSSystem")
  22. print(f"安装位置: {install_prefix}")
  23. if input("[Y/n] ") != "Y":
  24. exit(1)
  25. if len(sys.argv) == 2:
  26. install = ["garbage", "manager", "rank", "website"]
  27. else:
  28. install = []
  29. for i in sys.argv[2:]:
  30. if i.lower() in ["garbage", "manager", "rank", "website"] and i not in install:
  31. install.append(i.lower())
  32. if len(install) == 0:
  33. install = ["garbage", "manager", "rank", "website"]
  34. print(f"安装内容: {', '.join(install)}")
  35. if input("[Y/n] ") != "Y":
  36. exit(1)
  37. def check_make_dir(path):
  38. if not os.path.exists(path):
  39. os.makedirs(path) # 创建目录
  40. def delete(path):
  41. if os.path.isdir(path):
  42. print(f"删除目录: {path}")
  43. shutil.rmtree(path)
  44. elif os.path.isfile(path):
  45. print(f"删除文件: {path}")
  46. os.remove(path)
  47. check_make_dir(install_prefix)
  48. src = os.path.dirname(os.path.abspath(__file__))
  49. for i in os.listdir(install_prefix):
  50. if i in ['app', 'conf', 'core', 'equipment',
  51. 'init.py', 'init.sql', 'LICENSE', 'main.py', 'README.md', 'sql', 'tk_ui', 'tool']:
  52. delete(os.path.join(install_prefix, i))
  53. def copy_file(src_path, dest_path):
  54. print(f"复制文件: {src_path} -> {dest_path}")
  55. shutil.copy(src_path, dest_path)
  56. def copy_directory(src_path, dest_path):
  57. if not os.path.exists(dest_path):
  58. print(f"复制目录: {src_path} -> {dest_path}")
  59. shutil.copytree(src_path, dest_path)
  60. def install_base():
  61. """
  62. 安装基础部件
  63. tool包, conf包, Core包, MySQL包
  64. :return:
  65. """
  66. copy_file(os.path.join(src, "README.md"), os.path.join(install_prefix, "README.md"))
  67. copy_file(os.path.join(src, "LICENSE"), os.path.join(install_prefix, "LICENSE"))
  68. copy_file(os.path.join(src, "main.py"), os.path.join(install_prefix, "main.py"))
  69. copy_file(os.path.join(src, "init.py"), os.path.join(install_prefix, "init.py"))
  70. copy_file(os.path.join(src, "init.sql"), os.path.join(install_prefix, "init.sql"))
  71. copy_directory(os.path.join(src, "conf"), os.path.join(install_prefix, "conf"))
  72. copy_directory(os.path.join(src, "tool"), os.path.join(install_prefix, "tool"))
  73. copy_directory(os.path.join(src, "core"), os.path.join(install_prefix, "core"))
  74. copy_directory(os.path.join(src, "sql"), os.path.join(install_prefix, "sql"))
  75. def install_website():
  76. copy_directory(os.path.join(src, "app"), os.path.join(install_prefix, "app"))
  77. def install_garbage():
  78. copy_directory(os.path.join(src, "equipment"), os.path.join(install_prefix, "equipment"))
  79. check_make_dir(os.path.join(install_prefix, "tk_ui"))
  80. tk_ui_path = os.path.join(install_prefix, "tk_ui")
  81. copy_file(os.path.join(src, "tk_ui", "station.py"), os.path.join(tk_ui_path, "station.py"))
  82. copy_file(os.path.join(src, "tk_ui", "station_event.py"), os.path.join(tk_ui_path, "station_event.py"))
  83. copy_file(os.path.join(src, "tk_ui", "event.py"), os.path.join(tk_ui_path, "event.py"))
  84. def install_rank():
  85. copy_directory(os.path.join(src, "equipment"), os.path.join(install_prefix, "equipment"))
  86. check_make_dir(os.path.join(install_prefix, "tk_ui"))
  87. tk_ui_path = os.path.join(install_prefix, "tk_ui")
  88. copy_file(os.path.join(src, "tk_ui", "ranking.py"), os.path.join(tk_ui_path, "ranking.py"))
  89. copy_file(os.path.join(src, "tk_ui", "event.py"), os.path.join(tk_ui_path, "event.py"))
  90. def install_admin():
  91. copy_directory(os.path.join(src, "equipment"), os.path.join(install_prefix, "equipment"))
  92. check_make_dir(os.path.join(install_prefix, "tk_ui"))
  93. tk_ui_path = os.path.join(install_prefix, "tk_ui")
  94. copy_file(os.path.join(src, "tk_ui", "admin.py"), os.path.join(tk_ui_path, "admin.py"))
  95. copy_file(os.path.join(src, "tk_ui", "admin_event.py"), os.path.join(tk_ui_path, "admin_event.py"))
  96. copy_file(os.path.join(src, "tk_ui", "admin_program.py"), os.path.join(tk_ui_path, "admin_program.py"))
  97. copy_file(os.path.join(src, "tk_ui", "admin_menu.py"), os.path.join(tk_ui_path, "admin_menu.py"))
  98. copy_file(os.path.join(src, "tk_ui", "event.py"), os.path.join(tk_ui_path, "event.py"))
  99. def install_venv():
  100. venv = os.path.join(install_prefix, 'venv')
  101. if not os.path.exists(venv):
  102. print(f"执行: {sys.executable} -m venv {venv}")
  103. os.system(f"{sys.executable} -m venv {venv}")
  104. if os.name == 'nt':
  105. suffix = os.path.splitext(sys.executable)[-1]
  106. else:
  107. suffix = ""
  108. for path, dirs, files in os.walk(venv):
  109. if f"python{suffix}" in files:
  110. return os.path.join(path, f"python{suffix}")
  111. return None
  112. def run_init():
  113. init_py = os.path.join(install_prefix, "main.py")
  114. print(f"执行文件: {init_py}")
  115. os.system(f"{python} {init_py} --program setup")
  116. def write_bat():
  117. main = os.path.join(install_prefix, "main.py")
  118. for i in ['setup'] + install:
  119. bat = os.path.join(install_prefix, f"{i}_HGSSystem.bat")
  120. print(f"创建批处理文件 {bat}")
  121. with open(bat, "w") as f:
  122. if i != "website":
  123. f.write(''' @echo off
  124. if "%1" == "h" goto begin
  125. mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
  126. :begin\n''') # 隐藏 cmd 的命令
  127. f.write(f"{python} {main} --program {i} --run release")
  128. def write_shell():
  129. main = os.path.join(install_prefix, "main.py")
  130. for i in ['setup'] + install:
  131. bat = os.path.join(install_prefix, f"{i}_HGSSystem.sh")
  132. print(f"创建shell脚本 {bat}")
  133. with open(bat, "w") as f:
  134. f.write(f"{python} {main} --program {i} --run release")
  135. install_base()
  136. for i in install:
  137. print(f"安装 {i} 系统 - 开始")
  138. if i == "garbage":
  139. install_garbage()
  140. elif i == "manager":
  141. install_admin()
  142. elif i == "rank":
  143. install_rank()
  144. elif i == 'website':
  145. install_website()
  146. print(f"安装 {i} 系统 - 完成")
  147. python = install_venv()
  148. if python is None:
  149. print("虚拟环境创建失败", file=sys.stderr)
  150. exit(1)
  151. print(f"虚拟环境创建成功: {python}")
  152. run_init()
  153. if os.name == 'nt':
  154. write_bat()
  155. elif os.name == 'posix':
  156. write_shell()
  157. print("安装结束")