setup.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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. suffix = os.path.splitext(sys.executable)[-1]
  105. for path, dirs, files in os.walk(venv):
  106. if f"python{suffix}" in files:
  107. return os.path.join(path, f"python{suffix}")
  108. return None
  109. def run_init():
  110. init_py = os.path.join(install_prefix, "main.py")
  111. print(f"执行文件: {init_py}")
  112. os.system(f"{python} {init_py} --program setup")
  113. def write_bat():
  114. main = os.path.join(install_prefix, "main.py")
  115. for i in ['setup'] + install:
  116. bat = os.path.join(install_prefix, f"{i}_HGSSystem.bat")
  117. print(f"创建批处理文件 {bat}")
  118. with open(bat, "w") as f:
  119. if i != "website":
  120. f.write(''' @echo off
  121. if "%1" == "h" goto begin
  122. mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
  123. :begin\n''') # 隐藏 cmd 的命令
  124. f.write(f"{python} {main} --program {i} --run release")
  125. def write_shell():
  126. main = os.path.join(install_prefix, "main.py")
  127. for i in ['setup'] + install:
  128. bat = os.path.join(install_prefix, f"{i}_HGSSystem.sh")
  129. print(f"创建shell脚本 {bat}")
  130. with open(bat, "w") as f:
  131. f.write(f"{python} {main} --program {i} --run release")
  132. install_base()
  133. for i in install:
  134. print(f"安装 {i} 系统 - 开始")
  135. if i == "garbage":
  136. install_garbage()
  137. elif i == "manager":
  138. install_admin()
  139. elif i == "rank":
  140. install_rank()
  141. elif i == 'website':
  142. install_website()
  143. print(f"安装 {i} 系统 - 完成")
  144. python = install_venv()
  145. if python is None:
  146. print("虚拟环境创建失败", file=sys.stderr)
  147. exit(1)
  148. print(f"虚拟环境创建成功: {python}")
  149. run_init()
  150. if os.name == 'nt':
  151. write_bat()
  152. elif os.name == 'posix':
  153. write_shell()
  154. print("安装结束")