database-win-pkg/src/start.py

144 lines
4.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import argparse
import os
import re
import subprocess
import sys
import time
from datetime import datetime
import webview
from loguru import logger
# 获取当前脚本所在的目录
new_java_path = 'D:/database/jdk/bin/java.exe'
app_log_dir = 'D:/database/logs'
port = 12396
# 构建JDK和JAR的路径
jar_path = os.path.join("datas", "electromagnetic.jar")
url = f'http://127.0.0.1:{port}/index'
def ensure_dir(directory):
if not os.path.exists(directory):
os.makedirs(directory)
logger.info(f"目录 {directory} 已创建")
else:
logger.info(f"目录 {directory} 已存在")
def get_resource_path(relative_path):
""" 获取资源绝对路径适用于开发环境和PyInstaller打包后 """
if hasattr(sys, '_MEIPASS'):
# 打包后的资源路径sys._MEIPASS + 相对路径
base_path = sys._MEIPASS
else:
# 开发环境的基础路径
base_path = os.path.dirname(os.path.abspath("."))
return os.path.join(base_path, relative_path)
def delete_old_files(directory, days=2):
# 计算时间阈值(当前时间 - days天
threshold_time = time.time() - days * 24 * 60 * 60
deleted_count = 0
try:
# 遍历目录中的文件
for filename in os.listdir(directory):
filepath = os.path.join(directory, filename)
# 确保是文件而不是目录
if os.path.isfile(filepath):
try:
# 获取文件创建时间Windows系统
creation_time = os.path.getctime(filepath)
# 检查文件是否超过阈值
if creation_time < threshold_time:
# 删除文件
os.remove(filepath)
deleted_count += 1
logger.info(f"已删除: {filename} (创建时间: {format_time(creation_time)})")
except Exception as e:
logger.info(f"处理文件 {filename} 时出错: {str(e)}", file=sys.stderr)
logger.info(f"\n操作完成!共删除 {deleted_count} 个日志文件。")
except Exception as e:
logger.info(f"遍历目录时出错: {str(e)}", file=sys.stderr)
def format_time(timestamp):
"""将时间戳格式化为可读字符串"""
return datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')
def start():
try:
ensure_dir(app_log_dir)
new_jar_path = get_resource_path(jar_path)
java_command = [new_java_path, "-Xms4096m", "-Xmx4096m", "-jar", new_jar_path]
# 创建新进程组支持Unix/Windows的进程隔离
creation_flags = subprocess.CREATE_NEW_PROCESS_GROUP
# 重定向输出到日志文件
formatted_time = datetime.now().strftime("%Y%m%d%H%M%S")
log_file = rf'{app_log_dir}\app_{formatted_time}.log'
with open(log_file, "a") as log:
process = subprocess.Popen(
java_command,
stdout=log,
stderr=log,
start_new_session=True, # 创建新会话
creationflags=creation_flags
)
logger.info(f"应用正在启动! PID: {process.pid}")
logger.info(f"日志输出: {os.path.abspath(log_file)}")
except Exception as e:
logger.info(f"启动失败: {str(e)}")
sys.exit(1)
def kill_process_by_port(run_port):
# 执行netstat命令获取端口占用信息
cmd_netstat = ['netstat', '-ano', '|', 'findstr', fr':{run_port}']
result = subprocess.run(cmd_netstat, capture_output=True, text=True, shell=True)
out = result.stdout
if out:
arr = re.split(r'\s+', out)
pid = arr[5]
if pid:
try:
subprocess.run(['taskkill', '/F', '/PID', pid], check=True)
logger.info(f"已终止占用端口 {run_port} 的进程 (PID: {pid})")
except subprocess.CalledProcessError:
logger.info(f"终止进程 {pid} 失败 (可能权限不足或进程不存在)")
else:
logger.info(f"端口 {run_port} 未被占用")
def open_web():
webview.settings['ALLOW_DOWNLOADS'] = True
webview.settings['OPEN_DEVTOOLS_IN_DEBUG'] = False
webview.create_window('数据库管理系统', url=url)
webview.start(debug=True)
if __name__ == '__main__':
kill_process_by_port(port)
delete_old_files(app_log_dir, days=2)
start()
time.sleep(10)
parser = argparse.ArgumentParser()
parser.add_argument('--startWindow',
type=lambda x: x.lower() == 'true',
default=None,
help='设置为true则打开本地窗口false或未设置则不执行')
args = parser.parse_args()
if args.startWindow:
open_web()
else:
logger.warning(f"请打开浏览器,输入 {url} 访问使用,使用期间,请不用关闭此窗口!")
while True:
pass