steup.py 6.4 KB

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