python 打包成exe执行闪退。
代码如下
import logging
from datetime import datetime
import pymysql
from pymysql import cursors, Error as PyMysqlError
import pytz
from apscheduler.schedulers.blocking import BlockingScheduler
# 日志配置保持不变
# 日志配置
logging.basicConfig(
filename='sync22.log',
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
#logging = logging.getlogging(__name__)
# 修正后的数据库配置
DB_CONFIG = {
'source': {
'host': 'localhost',
'port': 3306,
'user': 'root',
'password': 'root',
'db': 'report',
'charset': 'utf8',
'cursorclass': cursors.DictCursor # 明确指定字典游标
},
'target': {
'host': 'localhost',
'port': 3306,
'user': 'root',
'password': 'root',
'db': 'report',
'charset': 'utf8',
'cursorclass': cursors.DictCursor
}
}
# --------------------- 数据库连接修正 ---------------------
def get_mdb_connection():
"""修复时区设置"""
try:
conn = pymysql.connect(**DB_CONFIG['source'])
with conn.cursor() as cursor:
cursor.execute("SET time_zone = '+00:00'") # 通过SQL设置时区
return conn
except PyMysqlError as err:
logging.error(f"源数据库连接失败: {err}", exc_info=True)
raise
def get_target_db_connection():
"""修复目标库配置错误"""
try:
conn = pymysql.connect(**DB_CONFIG['target']) # 修正为 target
with conn.cursor() as cursor:
cursor.execute("SET time_zone = '+00:00'")
return conn
except PyMysqlError as err:
logging.error(f"目标数据库连接失败: {err}", exc_info=True)
raise
# --------------------- 关键逻辑修正 ---------------------
def check_record_exists(uid):
"""修复游标类型"""
try:
with get_target_db_connection() as conn:
with conn.cursor(cursors.DictCursor) as cursor: # 明确指定游标类型
cursor.execute(
"SELECT id FROM my_peiliao WHERE uid = %s",
(uid,)
)
return bool(cursor.fetchone())
except PyMysqlError as err:
logging.error(f"存在性检查失败: {err}", exc_info=True)
return False
def insert_record(record_data):
"""插入新记录(优化事务处理)"""
columns = [
'zlcode', 'order_number', 'weight', 'date',
'd', 'f', 'h', 'e', 'uid'
]
sql = f"""
INSERT INTO my_peiliao
({', '.join(columns)})
VALUES ({', '.join(['%s'] * len(columns))})
"""
try:
with get_target_db_connection() as conn:
cursor = conn.cursor()
cursor.execute(sql, record_data)
conn.commit()
except PyMysqlError as err:
logging.error(f"Insert error: {err}")
conn.rollback()
raise
def scheduled_task():
"""修复时区一致性"""
logging.info("---------- 任务开始 ----------")
start_time = datetime.now(pytz.utc) # 统一使用UTC时区
try:
with get_mdb_connection() as conn:
with conn.cursor(cursors.DictCursor) as cursor:
query = """
SELECT *
FROM zg_size_report
WHERE T = 'T'
ORDER BY time DESC
LIMIT 10
"""
cursor.execute(query)
processed = 0
for row in cursor:
try:
uid = row['ID']
if not check_record_exists(uid):
record_data = (
row['neibuzhilianghao'],
row['dingdanhao'],
row['total_weight'],
row['time'],
row['kehu'],
row['n_num'],
row['j_num'],
row['peiliaoyuan'],
uid
)
insert_record(record_data)
logging.info(f"已插入新记录: {uid}")
processed += 1
except Exception as e:
logging.error(f"单条记录处理失败: {e}", exc_info=True)
logging.info(f"处理完成: 成功{processed}条/总共{cursor.rowcount}条")
except PyMysqlError as err:
logging.error(f"数据库错误: {err}", exc_info=True)
except Exception as e:
logging.error(f"任务异常: {e}", exc_info=True)
finally:
elapsed = (datetime.now(pytz.utc) - start_time).total_seconds()
logging.info(f"任务耗时: {elapsed:.2f}秒\n")
# 其他函数保持不变...
if __name__ == "__main__":
try:
scheduler = BlockingScheduler(timezone=pytz.utc)
scheduler.add_job(
scheduled_task,
'cron',
second='*/1',
misfire_grace_time=60
)
logging.info("程序启动...")
scheduler.start()
except Exception as e:
logging.error(f"致命错误: {e}", exc_info=True)
finally:
if 'scheduler' in locals():
scheduler.shutdown()
我在pyCharm 里执行可以执行成功并打印日志,使用pyinstaller .\report-job-v3.py
命令打包成exe后 在exe生成的目录执行好使 但是exe复制到别的文件夹执行就闪退 且没有生成日志文件
把日志配置改了之后打包好使了,可能是日志路径没找到报错了
新增代码:获取exe所在目录并设置日志路径
if getattr(sys, 'frozen', False):
else:
os.makedirs(exe_dir, exist_ok=True)
log_path = os.path.join(exe_dir, 'sync22.log')
日志配置
logging.basicConfig(
)