setup.py 6.9 KB

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