123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- """
- 安装程序
- 1) 检查python版本
- 2) 复制文件到安装目录
- 3) 生成启动文件
- """
- import os
- import sys
- import warnings
- import shutil
- if sys.version_info.major != 3:
- warnings.warn("请使用 Python3 运行程序") # 使用 warning 确保 python2 可以输出提示
- exit(1)
- if sys.version_info.minor < 7:
- warnings.warn("请使用python3.7以上版本")
- if sys.version_info.minor < 9:
- warnings.warn("建议使用python3.9以上版本")
- if len(sys.argv) == 1:
- print("请指定安装目录", file=sys.stderr)
- exit(1)
- install_prefix = sys.argv[1]
- if install_prefix.endswith(os.sep) or install_prefix.endswith('/'):
- install_prefix = os.path.join(install_prefix[:-1], "HGSSystem")
- print(f"安装位置: {install_prefix}")
- if input("[Y/n] ") != "Y":
- exit(1)
- if len(sys.argv) == 2:
- install = ["garbage", "manager", "ranking", "website"]
- else:
- install = []
- for i in sys.argv[2:]:
- if i.lower() in ["garbage", "manager", "ranking", "website"] and i not in install:
- install.append(i.lower())
- if len(install) == 0:
- install = ["garbage", "manager", "ranking", "website"]
- print(f"安装内容: {', '.join(install)}")
- if input("[Y/n] ") != "Y":
- exit(1)
- def check_make_dir(path):
- if not os.path.exists(path):
- os.makedirs(path) # 创建目录
- def delete(path):
- if os.path.isdir(path):
- print(f"删除目录: {path}")
- shutil.rmtree(path)
- elif os.path.isfile(path):
- print(f"删除文件: {path}")
- os.remove(path)
- check_make_dir(install_prefix)
- src = os.path.dirname(os.path.abspath(__file__))
- for i in os.listdir(install_prefix):
- if i in ['app', 'conf', 'core', 'equipment',
- 'init.py', 'init.sql', 'LICENSE', 'main.py', 'README.md', 'sql', 'tk_ui', 'tool']:
- delete(os.path.join(install_prefix, i))
- def copy_file(src_path, dest_path):
- print(f"复制文件: {src_path} -> {dest_path}")
- shutil.copy(src_path, dest_path)
- def copy_directory(src_path, dest_path):
- if not os.path.exists(dest_path):
- print(f"复制目录: {src_path} -> {dest_path}")
- shutil.copytree(src_path, dest_path)
- def install_base():
- """
- 安装基础部件
- tool包, conf包, Core包, MySQL包
- :return:
- """
- copy_file(os.path.join(src, "README.md"), os.path.join(install_prefix, "README.md"))
- copy_file(os.path.join(src, "LICENSE"), os.path.join(install_prefix, "LICENSE"))
- copy_file(os.path.join(src, "main.py"), os.path.join(install_prefix, "main.py"))
- copy_file(os.path.join(src, "init.py"), os.path.join(install_prefix, "init.py"))
- copy_file(os.path.join(src, "init.sql"), os.path.join(install_prefix, "init.sql"))
- if not os.path.exists(os.path.join(install_prefix, "HGSSystem.conf.py")):
- copy_file(os.path.join(src, "HGSSystem.conf.py"), os.path.join(install_prefix, "HGSSystem.conf.py"))
- copy_directory(os.path.join(src, "conf"), os.path.join(install_prefix, "conf"))
- copy_directory(os.path.join(src, "tool"), os.path.join(install_prefix, "tool"))
- copy_directory(os.path.join(src, "core"), os.path.join(install_prefix, "core"))
- copy_directory(os.path.join(src, "sql"), os.path.join(install_prefix, "sql"))
- def install_website():
- copy_directory(os.path.join(src, "app"), os.path.join(install_prefix, "app"))
- def install_garbage():
- copy_directory(os.path.join(src, "equipment"), os.path.join(install_prefix, "equipment"))
- check_make_dir(os.path.join(install_prefix, "tk_ui"))
- tk_ui_path = os.path.join(install_prefix, "tk_ui")
- copy_file(os.path.join(src, "tk_ui", "station.py"), os.path.join(tk_ui_path, "station.py"))
- copy_file(os.path.join(src, "tk_ui", "station_event.py"), os.path.join(tk_ui_path, "station_event.py"))
- copy_file(os.path.join(src, "tk_ui", "event.py"), os.path.join(tk_ui_path, "event.py"))
- def install_rank():
- copy_directory(os.path.join(src, "equipment"), os.path.join(install_prefix, "equipment"))
- check_make_dir(os.path.join(install_prefix, "tk_ui"))
- tk_ui_path = os.path.join(install_prefix, "tk_ui")
- copy_file(os.path.join(src, "tk_ui", "ranking.py"), os.path.join(tk_ui_path, "ranking.py"))
- copy_file(os.path.join(src, "tk_ui", "event.py"), os.path.join(tk_ui_path, "event.py"))
- def install_admin():
- copy_directory(os.path.join(src, "equipment"), os.path.join(install_prefix, "equipment"))
- check_make_dir(os.path.join(install_prefix, "tk_ui"))
- tk_ui_path = os.path.join(install_prefix, "tk_ui")
- copy_file(os.path.join(src, "tk_ui", "admin.py"), os.path.join(tk_ui_path, "admin.py"))
- copy_file(os.path.join(src, "tk_ui", "admin_event.py"), os.path.join(tk_ui_path, "admin_event.py"))
- copy_file(os.path.join(src, "tk_ui", "admin_program.py"), os.path.join(tk_ui_path, "admin_program.py"))
- copy_file(os.path.join(src, "tk_ui", "admin_menu.py"), os.path.join(tk_ui_path, "admin_menu.py"))
- copy_file(os.path.join(src, "tk_ui", "event.py"), os.path.join(tk_ui_path, "event.py"))
- def install_venv():
- venv = os.path.join(install_prefix, 'venv')
- if not os.path.exists(venv):
- print(f"执行: {sys.executable} -m venv {venv}")
- os.system(f"{sys.executable} -m venv {venv}")
- if os.name == 'nt':
- suffix = os.path.splitext(sys.executable)[-1]
- else:
- suffix = ""
- for path, dirs, files in os.walk(venv):
- if f"python{suffix}" in files:
- return os.path.join(path, f"python{suffix}")
- return None
- def run_init():
- init_py = os.path.join(install_prefix, "main.py")
- print(f"执行文件: {init_py}")
- os.system(f"{python} {init_py} --program setup")
- def write_bat():
- main = os.path.join(install_prefix, "main.py")
- for i in ['setup'] + install:
- bat = os.path.join(install_prefix, f"{i}_HGSSystem.bat")
- print(f"创建批处理文件 {bat}")
- with open(bat, "w") as f:
- if i != "website":
- f.write(''' @echo off
- if "%1" == "h" goto begin
- mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
- :begin\n''') # 隐藏 cmd 的命令
- f.write(f"{python} {main} --program {i} --run release")
- def write_shell():
- main = os.path.join(install_prefix, "main.py")
- for i in ['setup'] + install:
- bat = os.path.join(install_prefix, f"{i}_HGSSystem.sh")
- print(f"创建shell脚本 {bat}")
- with open(bat, "w") as f:
- f.write(f"{python} {main} --program {i} --run release")
- os.system(f"chmod a+x {bat}")
- install_base()
- for i in install:
- print(f"安装 {i} 系统 - 开始")
- if i == "garbage":
- install_garbage()
- elif i == "manager":
- install_admin()
- elif i == "ranking":
- install_rank()
- elif i == 'website':
- install_website()
- print(f"安装 {i} 系统 - 完成")
- python = install_venv()
- if python is None:
- print("虚拟环境创建失败", file=sys.stderr)
- exit(1)
- print(f"虚拟环境创建成功: {python}")
- run_init()
- if os.name == 'nt':
- write_bat()
- elif os.name == 'posix':
- write_shell()
- print("安装结束")
|